2017-03-17 61 views
0

我在调整我写的函数时挣扎不已,这让我很头疼,所以我想我会在这里发布它。通过按函数的加权平均值

在函数中我使用R的“by”函数,它将数据框放入子集中并在其上运行函数。

现在我正在扩展函数以包含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具有的数据(例如缺失/ fitlered数据)和重可变。

第8条命令就是我现在所拥有的,但现在我需要为它添加权重。 所以这给了我每种颜色的平均值。也就是说,在我没有任何数据的情况下,d2的水平会返回NA,这是我需要的。 (因为我正在处理不同的数据集并需要合并结果,所以定义的所有级别也都会输出,这一点很重要。)

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

我一直在试图看看weighted.mean的代码,看看我不能重写它,但还没有找到解决方案。任何帮助都是值得欢迎的。

回答

0

的诀窍是使用整个data.frame作为输入由indicies

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

的Tx百万分,完美的作品..不知道那一个,但是从现在起将记住它.. –