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

时间:2015-09-22 15:18:23

标签: r 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?

中使用无效的列名作为变量

3 个答案:

答案 0 :(得分:5)

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

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

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

mean(DT[[my_column]])

答案 1 :(得分:5)

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

.

虽然DT[ , mean(`0b`)] 也有效:

get

DT[ , mean(get("0b"))] 可以提取列:

!with

虽然您可能只想sapply(DT[ , "0b", with = FALSE], mean) 完全摆脱讨厌的列名(通过引用)

setnames

答案 2 :(得分:5)

在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