Могу ли я выполнить расчеты маржи в ddply ()? - PullRequest
0 голосов
/ 05 января 2010

Функция cast() отлично подходит для расчета полей для совокупных значений:

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().

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

1 Ответ

2 голосов
/ 06 января 2010

Красиво вычислять поля самостоятельно:

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)
)
...