【问题标题】:Pass argument to data.table aggregation function将参数传递给 data.table 聚合函数
【发布时间】:2013-11-25 15:37:00
【问题描述】:

我有一个函数可以计算变量的加权平均值,并使用 data.table 聚合语法按时间段对其进行分组。但是,我想以编程方式提供权重列的名称。有没有办法在仍然使用传统的data.table 语法的同时实现这一点?下面的函数wtmean1 演示了我想要做什么的想法(但它会产生错误)。函数wtmean2 工作并受到data.table 常见问题解答的启发,但传递整个表达式更麻烦,并且无法提取函数内的权重列的名称,这可能需要。有没有办法让wtmean1 工作,我传入的唯一参数是字符串中加权列的名称?

wtmean1 <- function(dt1, weight) {
  dt1[,weighted.mean(x, weight), by=timeperiod]
}

wtmean2 <- function(dt1, expr) {
  dt1[,eval(substitute(expr)), by=timeperiod]
}

mydata <- data.table(x=1:10, timeperiod=rep(1:2,5), wt1=rnorm(10), wt2=rnorm(10))
wtmean1(mydata, "wt1") # ERROR
wtmean2(mydata, weighted.mean(x, wt2))

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    你可以使用get:

    wtmean1 <- function(dt1, weight) {
      dt1[,weighted.mean(x, get(weight)), by=timeperiod]
    }
    

    使用您的示例数据:

    > set.seed(1)
    > mydata <- data.table(x=1:10, timeperiod=rep(1:2,5), wt1=rnorm(10), wt2=rnorm(10))
    > wtmean1(mydata, "wt1")
       timeperiod          V1
    1:          1 -102.476925
    2:          2    3.362326
    

    【讨论】:

    • 太棒了!我相信这是我第一次使用get。了解更多这是如何工作的会很棒。或许你可以扩大一下答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2018-07-04
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多