【问题标题】:Aggregate and Weighted Mean for multiple columns in RR中多列的聚合和加权平均值
【发布时间】:2017-03-24 07:41:19
【问题描述】:

问题基本上是这样的:Aggregate and Weighted Mean in R

但我希望它使用 data.table 在几列上计算它,因为我有数百万行。所以是这样的:

set.seed(42)   # fix seed so that you get the same results
dat <- data.frame(assetclass=sample(LETTERS[1:5], 20, replace=TRUE), 
                                    tax=rnorm(20),tax2=rnorm(20), assets=1e7+1e7*runif(20), assets2=1e6+1e7*runif(20))

DT <- data.table(dat)

我可以计算一列资产的加权平均值,如下所示:

DT[,list(wret = weighted.mean(tax,assets)),by=assetclass]

但是如何在 assets 和 assets2 上做到这一点呢?
如果有多个列,比如col=c("assets1", "assets2", "assets3", ... ),该怎么办? 并且是否也可以为税收,tax1...

【问题讨论】:

  • 很抱歉造成混乱,点(.)不小心潜入,返回是从原始问题继承的。
  • DT[, .(wret = weighted.mean(ret,assets)), by=.(assetclass, assets)] 不起作用,因为它会按资产类别和资产分组。我想要的是衡量平均值时使用的两个不同的行。像这样:DT[, .(wret = weighted.mean(ret,.(assets, assets2)), by=assetclass]
  • DT[, .(wret = weighted.mean(tax,assets), wret2 = weighted.mean(tax,asets2)), by=assetclass] 是什么?或者这是什么意思:但是如何在两者上都做到这一点?请给出您想要的结果,即编辑您的问题。
  • 我们到了 :) - 如果有一整列列,比如 col=c("assets1", "assets2", "assets3", ... )

标签: r data.table weighted-average


【解决方案1】:

所以你可以为几列权重做这个

DT <- data.table(assetclass=sample(LETTERS[1:5], 20, replace=TRUE), 
                  tax=rnorm(20), assets=1e7+1e7*runif(20), asets2=1e6+1e7*runif(20))
DT[, lapply(.SD, FUN=weighted.mean, x=tax), by=assetclass, .SDcols=3:4]
#    assetclass      assets       asets2
# 1:          D -0.14179882 -0.003717957
# 2:          B  0.61146928  0.523913589
# 3:          E -0.28037796 -0.147677384
# 4:          C -0.09658125 -0.010338894
# 5:          A  0.74954460  0.750190947

或者您可以从.SD 中排除非权重列:

DT[, lapply(.SD, FUN=weighted.mean, x=tax), by=assetclass, .SDcols=-(1:2)]

这是一个使用矩阵乘法的变体:

DT[, as.list(crossprod(as.matrix(.SD), tax)/colSums(.SD)), by=assetclass, .SDcols=-(1:2)]

矩阵乘法也可以用于几列tax1, tax2, ...

DT <- data.table(assetclass=sample(LETTERS[1:5], 20, replace=TRUE), 
                 tax1=rnorm(20), tax2=rnorm(20), assets=1e7+1e7*runif(20), asets2=1e6+1e7*runif(20))
DT[, as.list(crossprod(as.matrix(.SD), tax1)/colSums(.SD)), by=assetclass, .SDcols=-(1:2)]
DT[, as.list(crossprod(as.matrix(.SD), tax2)/colSums(.SD)), by=assetclass, .SDcols=-(1:2)]
DT[, as.list(crossprod(as.matrix(.SD), cbind(tax1, tax2))/colSums(.SD)), by=assetclass, .SDcols=-(1:2)]

【讨论】:

  • 是否可以为 tax、tax1... 等做这件事?
  • weighted.mean(1:5, 11:15); weighted.mean(11:15, 1:5)
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多