通过By函数加权意味着

时间:2017-03-17 11:48:39

标签: r weighted-average

我在努力调整我写的一个功能,这让我很头疼,所以我想把它发布在这里。

在函数I中使用" by" R的函数,它将数据帧放在子集中并在其上运行函数。

现在我将功能扩展为包括weighted.mean(来自' descr'包),并且我得到一个错误,即x和w的长度不相等。

要显示的一些代码:

set.seed(100)
d1 <- rnorm(300)
d2 <- (floor(runif(100, min=1, max=4)))
weight <- rnorm(300,mean = 1, sd = 1)
df <- cbind.data.frame(d1,d2,weight)
df$d2 <- factor(df$d2,
                levels = c(1,2,3,4),
                labels = c("red", "blue", "green","orange")) 



require('descr')

by(df$d1, df$d2, function(x) mean(x=x, na.rm=TRUE))
by(df$d1, df$d2, function(x) weighted.mean(x=x,w=df$weight na.rm=TRUE))

所以我制作的数据帧有1个数值,1个因子有4个等级,但只有3个有数据(例如缺失/适合数据)和权重变量。

第8个命令就是我现在所拥有的,但现在我需要增加它的重量。 所以这给了我每种颜色的平均值。它还返回了d2级别的NA,我没有任何数据,这就是我需要的。 (由于我正在处理不同的数据集并需要合并结果,因此定义所有已定义的级别也很重要。)

第9个命令(其中包含weighted.mean的命令)返回一个错误,即x / w的长度不同。 这是因为通过为每片df $ d2创建一个df $ d1的子集,但weight.mean(x = x,w = weight,...)中的权重是整个变量,而不仅仅是子集。

我一直在试着看看weighted.mean的代码,看看我是否可以重写它,但还没有找到解决方案。随时欢迎任何帮助。

1 个答案:

答案 0 :(得分:0)

诀窍是使用整个data.frame作为输入除以指标

by(data = df, INDICES = df$d2, FUN = function(dfgroup) {
  weighted.mean(x = dfgroup$d1, w = dfgroup$weight, na.rm=TRUE)
})