在 j data.table 中使用语法无效的名称

Use syntactically invalid names in j data.table

我有一个 data.table 列名不是有效的 R 名称

DT = data.table(a = c(1, 2), `0b` = c(4, 5))

我想用这样的东西

my_column <- "0b"
DT[, mean(eval(parse(text = my_column)))] 

但是我得到一个错误

Error in parse(text = my_column) : <text>:1:2: unexpected symbol
1: 0b
     ^

有什么方法可以做到这一点,即使用无效的列名作为 j 中的变量?

我们可以在 .SDcols 中指定列并使用 .SD

获取 mean
DT[, mean(.SD[[1L]]),.SDcols=my_column]

或者我们可以使用 [[ 对列进行子集化,然后得到 mean.

mean(DT[[my_column]])

正如您在声明示例时指定的那样,使用反引号 (`) 是处理奇怪列名的常用方法:

DT[ , mean(`0b`)]

尽管 get 也有效:

DT[ , mean(get("0b"))]

我们也可以用 data.frame 的方式

sapply(DT[ , "0b"], mean)

尽管您可能只是想 setnames 完全摆脱讨厌的列名(通过引用)

setnames(DT, "0b", "something_digestible")

在 R 中,语法无效的名称需要反引号才能进行评估。虽然 .SDcols 可能是正确的方法,但您可以使用 as.name()as.symbol() 将字符 my_column 变成反引号名称。

DT[, mean(eval(as.name(my_column)))]
# [1] 4.5

或者更笨拙的方法是

with(DT, do.call(mean, list(as.name(my_column))))
# [1] 4.5