Вопрос:

сгруппировать в R, ddply с weighted.mean

r group-by

12542 просмотра

2 ответа

14604 Репутация автора

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

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

Автор: Matt Bannert Источник Размещён: 18.07.2010 09:29

Ответы (2)


17 плюса

295491 Репутация автора

Решение

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

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

Автор: Dirk Eddelbuettel Размещён: 18.07.2010 09:44

20 плюса

84331 Репутация автора

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

ddply(iris, "Species", summarise, 
  wmn = weighted.mean(Sepal.Length, Petal.Length),
  mn = mean(Sepal.Length))
Автор: hadley Размещён: 19.07.2010 02:01
Вопросы из категории :
32x32