Агрегируйте данные, используя each () с reshape2 :: dcast - PullRequest
4 голосов
/ 12 марта 2012

Я обычно использую пакет reshape для агрегирования некоторых данных (d'uh), обычно с plyr, из-за его невероятной функции each.Недавно я получил предложение переключиться на reshape2 и попробовать его, и теперь я больше не могу использовать each волшебство.

изменить форму

> m <- melt(mtcars, id.vars = c("am", "vs"), measure.vars = "hp")
> cast(m, am + vs ~ variable, each(min, max, mean, sd))
  am vs hp_min hp_max   hp_mean    hp_sd
1  0  0    150    245 194.16667 33.35984
2  0  1     62    123 102.14286 20.93186
3  1  0     91    335 180.83333 98.81582
4  1  1     52    113  80.57143 24.14441

изменить форму2

require(plyr)
> m <- melt(mtcars, id.vars = c("am", "vs"), measure.vars = "hp")
> dcast(m, am + vs ~ variable, each(min, max, mean, sd))
Error in structure(ordered, dim = ns) : 
  dims [product 4] do not match the length of object [16]
In addition: Warning messages:
1: In fs[[i]](x, ...) : no non-missing arguments to min; returning Inf
2: In fs[[i]](x, ...) : no non-missing arguments to max; returning -Inf

У меня не было настроения расчесывать это, поскольку мой предыдущий код работает как брелок с reshape, но я бы очень хотел знать:

  1. можно ли использовать each с dcast?
  2. целесообразно ли вообще использовать reshape2?reshape устарело?

1 Ответ

5 голосов
/ 12 марта 2012

Ответ на ваш первый вопрос: нет . Цитата из ?reshape2:::dcast:

Если указанная вами комбинация переменных не однозначно идентифицирует одна строка в исходном наборе данных, вам нужно будет предоставить агрегатная функция, fun.aggregate. Эта функция должна занять вектор чисел и возвращает единую сводную статистику.

Взгляд на страницу github Хэдли для reshape2 показывает, что он знает, что эта функциональность была удалена, но, кажется, думает, что лучше сделать это в plyr , предположительно с чем-то вроде:

ddply(m,.(am,vs),summarise,min = min(value),
                           max = max(value),
                           mean = mean(value),
                           sd = sd(value))

или если вы действительно хотите продолжать использовать each:

ddply(m,.(am,vs),function(x){each(min,max,mean,sd)(x$value)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...