2010-01-05 1 views
0

cast() функция велика при расчете полей для совокупных значений:Могу ли я выполнять вычисления маржи в ddply()?

cast(df, IDx1+IDx2~IDy1, margins=c('IDx1','IDx2','grand_row'),c(min, mean, max))

Проблема заключается в том, что мне нужно взвешивать свои средства с помощью второго вектора и пользовательскую функцию.

Конечно, ddply() позволяет мне применять пользовательские функции агрегирования для моих сгруппированных записей:

ddply(d, IDx1+IDx2~IDy1 , function(x) 
c(
min(x$value), 
MyFancyWeightedHarmonicMeanFunction(x$value,x$weight), 
max(x$value) 
) 
) 

... и это является удивительным.

Но что на самом деле сохранить день является возможность делать и то и другое одновременно, независимо от того, вызвав функцию два-вектора в cast() или притворяется каким-то образом margins=() переменной в ddply().

Возможно ли это?

ответ

2

Это довольно вычислить задворках себя:

ddply(d, "IDX1", ...) 
ddply(d, c("IDX1", "IDX2"), ...) 
ddply(d, "IDy1", ...) 

, а затем объединить результаты вместе с rbind. Было бы не слишком сложно превратить это в общую функцию.

Кроме того, я бы переписать исходный код, как:

ddply(d, IDx1+IDx2~IDy1, summarise, 
    min = min(value), 
    wt.mean = MyFancyWeightedHarmonicMeanFunction(value, weight), 
    max = max(value) 
) 
+0

Hadley, Спасибо за подсказку. Отдельные операции ddply, rbinded вместе, - это именно то, что я сделал. Все еще обнимаю и обобщаю, и трансформирую. –

+0

'rbind.fill' особенно полезно, когда ddply возвращает кадры данных с различным количеством столбцов. – Andrew