将参数传递给data.table聚合函数

6
我有一个函数,可以使用data.table的聚合语法,计算变量的加权平均值,并按时间段进行分组。然而,我想以编程方式提供加权列的名称。是否有一种方法可以在仍然使用传统的data.table语法的情况下实现这一点?下面的wtmean1函数演示了我想要做的事情的思路(但它会产生错误)。wtmean2函数是可行的,并受到data.table FAQ的启发,但它更繁琐,需要传递整个表达式,并且不可能在函数内部提取出加权列的名称,这可能是必需的。是否有一种方法可以使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))
1个回答

8
你可以使用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。了解更多关于它的工作原理将会很棒。也许你可以详细解释一下。 - marbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接