R数据帧中所有列的加权平均值



我有一个名为"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)

最新更新