我有一个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?
中使用无效的列名作为变量答案 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