Передайте имя столбца в data.table с помощью переменной

Возможный дубликат:
Вариативно выбор / назначение полей в таблице данных

В следующем примере я создаю таблицу данных с именами столбцов «x» и «v».

library('data.table')
DT <- data.table(x = c("b","b","b","a","a"), v = rnorm(5))

Я могу получить доступ к значениям столбца «x» следующим образом:

DT[ , x]
# [1] "b" "b" "b" "a" "a"

Но если я хочу получить доступ, передав переменную, это не сработает.

temp <- "x"
DT[ , temp]
# [1] "x"

Будет несколько столбцов, и мне нужно будет выбрать значения только для пары из них. Эти имена столбцов я предоставлю, пройдя через модуль R.

Ничего, я понял, должно быть:

DT[ , get(temp)]

person user1631306    schedule 26.09.2012    source источник
comment
использовать функцию get   -  person Jilber Urbina    schedule 26.09.2012


Ответы (1)


Используйте функции quote() и eval(), чтобы передать переменную в j. Когда вы делаете это таким образом, вам не нужны двойные кавычки в именах столбцов, потому что строка quote()-ed будет оцениваться внутри DT[]

temp <- quote(x)
DT[ , eval(temp)]
# [1] "b" "b" "b" "a" "a"

С одним именем столбца результатом будет вектор. Если вам нужен результат data.table или несколько столбцов, используйте форму списка

temp <- quote(list(x, v))
DT[ , eval(temp)]
#   x           v
# 1: b  1.52566586
# 2: b  0.66057253
# 3: b -1.29654641
# 4: a -1.71998260
# 5: a  0.03159933
person Douglas Clark    schedule 26.09.2012
comment
Для меня с R 3.2.0 это не работает. Я должен использовать get (temp), как указано в стартере потока. - person Exocom; 26.06.2015
comment
У меня уже есть множество имен столбцов в векторе символов, все они заключены в двойные кавычки. Как мне избавиться от цитат? - person Farrel; 28.06.2016
comment
И что произойдет, если у вас уже есть около 10 имен столбцов в операторе списка, но вы хотите добавить имена других столбцов gazillion. Так что для приведенного выше примера это будет что-то вроде DT[,list(favoritecolumn1, favoritecolumn2, favoritecolumn3, temp) - person Farrel; 28.06.2016
comment
@exocom ... У меня была такая же проблема, и вместо этого я использовал следующий ответ: stackoverflow.com/questions/12391950/ - person hartmut; 27.06.2017
comment
У меня работает: DT[, colnames, with=FALSE][[colnum]] - person ivan866; 27.02.2020
comment
Функция get() работает как в i, так и в j (версия R 3.6.3, версия таблицы данных 1.12.8), что является дополнительным преимуществом. - person sgrubsmyon; 09.04.2020