我有一个名为"allg2"的32x43数据帧,为了简单起见,我在这里将其一小部分重新创建为5x5:
gneiss mylonite syenite sedimentary Catg
0 3 4 0 -105.7
2 90 1 0 -99.7
15 51 0 0 -95.25
6 0 0 0 -90.5
0 3 9 0 -85.45
根据要求,样本计算:"片麻岩"柱应为wm=(0/21*-105.7)+(2/21*-99.7)+(15/21*-95.25)+(6/21*-90.5)+(0/21*-85.45)
我希望每列都有一个加权平均值(Catg中有感兴趣的值,每列都是该列的权重),但我能找到的每一个解决方案都依赖于所有列名的编码。没有这样的清单有可能做到这一点吗?注意:我刚刚意识到,我一直在翻转权重和值来称重。我的尝试:
wm=allg2[,lapply(.SD,weighted.mean,w=Catg),by=list(allg2[1,])]
Error: unused argument (by = list(allg2[1, ]))
我从这个线索中找到了这个想法,并试图将其适应我的情况。它不是因为列名不是一个真正的行而选择列名吗?我真的不知道这是在做什么,我试着移动by=部分,它给出了错误
Error in lapply(.SD, weighted.mean, w = Catg) : object '.SD' not found
另一次尝试是基于此线程。"Catg"在第43列,所以我试着这样组织行:
wm=apply(allg2, 2, function(x) weighted.mean(x[,43], x[,1:42]))
Error in x[, 43] : incorrect number of dimensions
我真的不理解这个错误,因为我的权重列应该在[,43]中。
我也试过:
mallg=data.matrix(allg2)
wm=colWeightedMeans(mallg,allg2$Catg)
Error in colWeightedMeans.matrix(mallg, allg2$Catg) : Argument 'w' has negative weights.
我在这里真的不知所措。我是犯了一些小错误,还是完全错误了?
假设权重在最后一列:
ll <- lapply(df[ , -ncol(df)], weighted.mean, w = df$Catg)
ll
# $gneiss
# [1] 4.555497
#
# $mylonite
# [1] 30.22283
#
# $syenite
# [1] 2.709924
#
# $sedimentary
# [1] 0
编辑:根据您的评论,您现在需要执行:
lapply(df[ , -ncol(df)], weighted.mean, x = df$Catg)
dt[,lapply(.SD,weighted.mean,w=Catg)]
apply(dt, 2, function(col) weighted.mean(x = col, w = dt[,Catg]))
我认为您需要更好地理解每个函数的自变量。
OP将问题更改为跨列的权重和Catg
中的值后更新-dt[,lapply(.SD,weighted.mean,x=Catg)];
apply(dt, 2, function(col) weighted.mean(w = col, x = dt[,Catg]))
我是R的新手,但为什么不呢:
sapply(allg2[,-ncol(allg2)], weighted.mean, allg2$Catg)