R中多列的聚合和加权平均值
Aggregate and Weighted Mean for multiple columns in R
问题基本上是这样的: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 <- 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)]
问题基本上是这样的: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 <- 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)]