1

我有一个名为“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.

我在这里真的很茫然。我是在犯一些小错误,还是以完全错误的方式解决这个问题?

4

3 回答 3

3

假设您的权重在最后一列:

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)
于 2013-11-30T16:44:59.517 回答
0
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]))

于 2013-11-30T16:46:00.023 回答
0

我是 R 新手,但为什么不呢:

sapply(allg2[,-ncol(allg2)], weighted.mean, allg2$Catg)
于 2013-11-30T16:55:21.930 回答