【问题标题】:Weighted means for all columns in R data.frameR data.frame 中所有列的加权平均值
【发布时间】:2013-11-30 16:38:31
【问题描述】:

我有一个名为“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, ]))

我从this thread 中发现了这个想法,并尝试将其适应我的情况。是不是因为它们不是真正的行而没有选择列名?我真的不知道这是在做什么,我尝试删除 by= 部分,这给出了错误

 Error in lapply(.SD, weighted.mean, w = Catg) : object '.SD' not found

另一个尝试是基于this thread。 “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.

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

【问题讨论】:

  • 您已经编辑了问题,这太令人困惑了。您能否手动做一个加权平均值,以便我们了解您的问题?
  • 很高兴,如有任何混淆,我们深表歉意。 '片麻岩' 列将是 wm=(0/21*-105.7)+(2/21*-99.7)+(15/21*-95.25)+(6/21*-90.5)+(0/21* -85.45)
  • 您应该意识到数据框与data.table 对象不同。您在第一次错误尝试中在数据帧上使用data.table 代码,这不是成功的方法。
  • 如果21是Catg中元素的总和,那么我的答案仍然有效。
  • @juliohm, 21 是“片麻岩”中元素的总和。

标签: r weighted-average


【解决方案1】:

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

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)

【讨论】:

  • 我才意识到我问错了问题;我把它翻过来了。权重在每一列中,感兴趣的值仅在最后一列中。我将编辑原始问题,但我将如何适应这种情况?
  • lapply(df[ , -ncol(df)], function(x) weighted.mean(df$Catg, w = x))
  • 只做一个最小的例子来捕捉你数据的所有相关特征——不多也不少——例如两种矿物,按相关顺序列出原始值和重量。然后我们将看到我们如何相应地更新答案。
  • @DWin,这非常有效!谢谢!编辑:我也刚刚意识到你解决了我最后一个 R 问题。
【解决方案2】:
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 新手,所以我仍在为这些术语苦苦挣扎。另外,我意识到我问错了问题,并已将其更新为:感兴趣的值在最后一列中,而各自的权重在其他列中。
  • 只是翻转了结构中的参数:)
  • 这看起来很有希望。但是,我在 lapply(.SD, weighted.mean, w = Catg) 中遇到错误:找不到对象'.SD'
  • 我认为 OP 不理解 dataframes != data.tables
  • 谢谢@DWin :)。 OP,欢迎来到 R。在尝试这些构造之前,您可能想做install.packages('data.table'); library(data.table); dt &lt;- data.table(dt)。数据表与数据帧不同,与数据帧相比,数据表在内存和速度方面效率更高。我强烈建议您在 Internet 上查找数据表并尝试使用它们。
【解决方案3】:

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

sapply(allg2[,-ncol(allg2)], weighted.mean, allg2$Catg)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2020-12-07
    • 2020-07-07
    • 2016-11-25
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多