【问题标题】:How to pass a column name through a variable to a function inside data.table?如何通过变量将列名传递给 data.table 中的函数?
【发布时间】: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 可能是对的,因为您可能正在寻找 .SDcolslapply(.SD, FUN) 的组合
  • @Frank 很有趣...我想这意味着 #1744 是(某种)记录在案的?

标签: r data.table


【解决方案1】:

大家都说对了,你也可以这样做:

dt[, sum(eval(parse(text = mnem)))]

【讨论】:

    【解决方案2】:

    @“R for the Win”的形式对于生成带有有意义的列标题的分组变量的摘要很有用(必要的?)。

    mtcarsDT <- setDT(copy(mtcars))
    makeSummaryTable <- function(dt, measure, group){
      dt[,.(N = .N, avg = mean(get(measure)), med = median(get(measure)))
        , by = eval(text = group)][order(get(group))]
    }
    makeSummaryTable(mtcars, 'qsec', 'am')
    

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多