【发布时间】:2016-12-20 23:24:33
【问题描述】:
我想将函数应用于名称在变量中的某个列。我可以用 eval() 选择它,但我不能将它传递给函数。
library(data.table)
dt <- data.table(col1 = 1:10)
mnem <- colnames(dt)[1]
# This works fine
dt[, eval(mnem)]
# None of these works
dt[, sum(mnem)]
dt[, sum(mnem), with = FALSE]
dt[, sum(eval(mnem))]
dt[, sum(eval(mnem)), with = FALSE]
【问题讨论】:
-
dt[, sum(.SD), .SDcols=mnem] -
在“详细”设置和按组计算时您将看到的消息是“在 j.ansvars 中找到的'(m)get'被设置为所有列。使用 .SDcols 或单个 j=eval(macro) 代替。两者都将检测使用的列,这对效率很重要。在这种情况下,您可能会使用
e = substitute(sum(mnem), list(mnem = as.symbol("col1"))); dt[, eval(e)]。仅供参考,FAQ 1.6 有更多关于 eval rawgit.com/wiki/Rdatatable/data.table/vignettes/… -
@user2957945 是的,虽然通常的约定是
lapply(.SD, sum)而不是sum(.SD)。 -
user2957945 和 Frank 可能是对的,因为您可能正在寻找
.SDcols和lapply(.SD, FUN)的组合 -
@Frank 很有趣...我想这意味着 #1744 是(某种)记录在案的?
标签: r data.table