Я пытаюсь сделать, "группа" - разрабатывает взвешенное среднее в 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 или даже записать что-то новое с нуля с подмножеством. В моем случае это было бы слишком много работы, надо надеяться, но там должен более умным решением с тем, что уже там.
спасибо за любые предложения заранее!
Используйте анонимную функцию:
> 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), а также невзвешенное среднее значение и возвращает оба значения.
Используйте суммирование (или суммирование):
ddply(iris, "Species", summarise,
wmn = weighted.mean(Sepal.Length, Petal.Length),
mn = mean(Sepal.Length))