我有一个data.table,列名不是有效的R名
DT = data.table(a = c(1, 2), `0b` = c(4, 5))
Run Code Online (Sandbox Code Playgroud)
我想用这样的东西
my_column <- "0b"
DT[, mean(eval(parse(text = my_column)))]
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误
Error in parse(text = my_column) : <text>:1:2: unexpected symbol
1: 0b
^
Run Code Online (Sandbox Code Playgroud)
有什么方法可以做到这一点,即使用无效的列名作为j中的变量?
我们可以指定列.SDcols并获得mean使用.SD
DT[, mean(.SD[[1L]]),.SDcols=my_column]
Run Code Online (Sandbox Code Playgroud)
或者我们可以使用列来对列进行子集化[[,然后获取mean.
mean(DT[[my_column]])
Run Code Online (Sandbox Code Playgroud)
正如您在声明示例中指定的那样,使用反引号(`)是处理奇怪列名的常用方法:
DT[ , mean(`0b`)]
Run Code Online (Sandbox Code Playgroud)
虽然get也有效:
DT[ , mean(get("0b"))]
Run Code Online (Sandbox Code Playgroud)
并且!with可以提取列:
sapply(DT[ , "0b", with = FALSE], mean)
Run Code Online (Sandbox Code Playgroud)
虽然你可能只是想setnames完全摆脱讨厌的列名(通过引用)
setnames(DT, "0b", "something_digestible")
Run Code Online (Sandbox Code Playgroud)
在R中,语法无效的名称需要反向标记才能进行评估.虽然.SDcols可能是正确的方法,但您可以使用as.name()或as.symbol()将字符my_column转换为反向标记的名称.
DT[, mean(eval(as.name(my_column)))]
# [1] 4.5
Run Code Online (Sandbox Code Playgroud)
或者更笨重的方式
with(DT, do.call(mean, list(as.name(my_column))))
# [1] 4.5
Run Code Online (Sandbox Code Playgroud)