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

kis*_*msu 2 r data.table

我有一个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中的变量?

akr*_*run 5

我们可以指定列.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)


Mic*_*ico 5

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

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)


Ric*_*ven 5

在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)