2010-07-18 94 views
9

我想在R中做一个“group by” - 样式加权平均值。有了一些基本的意思,下面的代码(使用Hadley的plyr包)运行良好。group by R,ddply with weighted.mean

ddply(mydf,.(period),mean) 

如果我用weighted.mean我得到以下错误“‘x’和‘W’必须具有相同的长度”,这一点我不明白,因为weighted.mean部分以外的作品同样的方法ddply。

weighted.mean(mydf$mycol,mydf$myweight) # works just fine 
ddply(mydf,.(period),weighted.mean,mydf$mycol,mydf$myweight) # returns the erros described above 
ddply(mydf,.(period),weighted.mean(mydf$mycol,mydf$myweight)) # different code same story 

我想编写自定义函数,而不是使用weighted.mean,然后把它传递给ddply甚至写新的东西从头与子集。就我而言,希望工作太多,但应该有一个更聪明的解决方案,以及已有的东西。

thx任何建议提前!

回答

17

使用匿名功能:

> ddply(iris,"Species",function(X) data.frame(wmn=weighted.mean(X$Sepal.Length, 
+                X$Petal.Length), 
+            mn=mean(X$Sepal.Length))) 
    Species  wmn mn 
1  setosa 5.016963 5.006 
2 versicolor 5.978075 5.936 
3 virginica 6.641535 6.588 
> 

此计算Sepal.Length的加权平均值(按Petal.Length加权)以及未加权平均值,并返回两者。

+0

这是很好的。到目前为止,还没有很多与匿名功能有关。看起来很值得一看。我还没有完全得到语法/想法,但我会研究它,thx寻求帮助!您是否需要在一行中打印所有内容,因为那里没有“{}”?我可以在哪里了解有关匿名功能的内容? – 2010-07-18 21:50:44

+1

那么,*所有*这些'* apply','by',...函数使用匿名函数,所以你应该找到大量的例子。一旦您将多个命令组合在一起,就需要花括号。最后,你没有使用一个匿名函数 - 你也可以定义你自己的 - 但使用它们可以节省输入:) – 2010-07-18 22:03:00

+0

'lapply(split(iris,species),weighted.mean)'或者那样的? – aL3xa 2010-07-18 23:27:32

20

使用总结(或总结):

ddply(iris, "Species", summarise, 
    wmn = weighted.mean(Sepal.Length, Petal.Length), 
    mn = mean(Sepal.Length)) 
+0

当我尝试这个表单时,我得到'错误in.list(by):'by'缺少'。调试器输出是难以理解的。任何线索哪里会出现这个错误?任何有兴趣尝试我的数据和'ddply()'调用? – 2012-07-02 16:27:07

+4

我在类似的代码上也得到了这个错误。该错误仅在RStudio中发生。这是由于在'search()'列表中'Hmisc :: summarize'高于'plyr :: ddply'。 [请参阅此链接](https://groups.google.com/forum/?fromgroups=#!topic/manipulatr/DF__5YfwE68)。通过用'summarise'替换'summarize'解决它:它工作并且不会与'Hmisc'产生冲突。欢迎来到依赖地狱! – 2013-04-11 19:48:53

+6

或者明确并使用'plyr :: summarize' – hadley 2013-04-11 22:51:02