在 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
我有一个 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