сгруппировать в R, ddply с weighted.mean - PullRequest
9 голосов
/ 19 июля 2010

Я пытаюсь создать взвешенное среднее в стиле «группа по» в R. С некоторым базовым средним значением следующий код (с использованием пакета plyr от Hadley) работал хорошо.

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 или даже написать что-то новое с нуля с подмножеством. В моем случае это будет слишком много работы, надеюсь, но должно быть более разумное решение с тем, что уже есть.

спасибо за любые предложения заранее!

Ответы [ 2 ]

20 голосов
/ 19 июля 2010

Используйте суммирование (или суммирование):

ddply(iris, "Species", summarise, 
  wmn = weighted.mean(Sepal.Length, Petal.Length),
  mn = mean(Sepal.Length))
17 голосов
/ 19 июля 2010

Использовать анонимную функцию:

> 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), а также невзвешенное среднее и возвращает оба значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...