我有一个名为“allg2”的 32x43 data.frame,为了简单起见,我在这里将其中的一小部分重新创建为 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.
我在这里真的很茫然。我是在犯一些小错误,还是以完全错误的方式解决这个问题?