R Plyr - Заказывать результаты из DDPLY? - PullRequest
6 голосов
/ 30 апреля 2011

Кто-нибудь знает хитрый способ упорядочить результаты, полученные в результате операции суммирования ddply?

Это то, что я делаю, чтобы упорядочить вывод по убыванию глубины.

  ddims <- ddply(diamonds, .(color), summarise, depth = mean(depth), table = mean(table))
  ddims <- ddims[order(-ddims$depth),]

С выводом ...

> ddims
  color    depth    table
7     J 61.88722 57.81239
6     I 61.84639 57.57728
5     H 61.83685 57.51781
4     G 61.75711 57.28863
1     D 61.69813 57.40459
3     F 61.69458 57.43354
2     E 61.66209 57.49120

Не слишком уродливо, но я надеюсь, что способ сделать это красиво в ddply ().Кто-нибудь знает как?

В книге Хэдли ggplot2 есть этот пример для ddply и подмножества, но на самом деле он не сортирует выходные данные, а просто выбирает два наименьших бриллианта на группу.

ddply(diamonds, .(color), subset, order(carat) <= 2)

Ответы [ 4 ]

7 голосов
/ 30 апреля 2011

Я воспользуюсь этим случаем, чтобы немного рекламировать data.table, который работает быстрее и (по моему мнению), по крайней мере, настолько элегантно, чтобы писать:

library(data.table)
ddims <- data.table(diamonds)
system.time(ddims <- ddims[, list(depth=mean(depth), table=mean(table)), by=color][order(depth)])

   user  system elapsed 
  0.003   0.000   0.004 

Для сравнения, без упорядочиванияВаш код ddply уже занимает в 30 раз больше времени:

  user  system elapsed 
 0.106   0.010   0.119

При всем моем уважении к отличной работе Хэдли, например, по ggplot2, и к общей удивительности, я должен признаться, что для меня, data.table полностью заменено ddply - по соображениям скорости.

3 голосов
/ 27 января 2014

Если вы используете dplyr, я бы порекомендовал воспользоваться оператором %.%, который читает более интуитивно понятный код.

data(diamonds, package = 'ggplot2')
library(dplyr)
diamonds %.%
  group_by(color) %.%
  summarise(
    depth = mean(depth),
    table = mean(table)
  ) %.%
  arrange(desc(depth))
3 голосов
/ 07 февраля 2013

Да, для сортировки вы можете просто вложить ddply в другой ddply. Вот как вы можете использовать ddply для сортировки по одному столбцу, например, по вашему table столбцу:

ddimsSortedTable <- ddply(ddply(diamonds, .(color), 
  summarise, depth = mean(depth), table = mean(table)), .(table))

  color    depth    table
1     G 61.75711 57.28863
2     D 61.69813 57.40459
3     F 61.69458 57.43354
4     E 61.66209 57.49120
5     H 61.83685 57.51781
6     I 61.84639 57.57728
7     J 61.88722 57.81239
1 голос
/ 27 января 2014

Немного опоздал на вечеринку, но с dplyr все может быть немного иначе.Заимствование решения crayola для data.table:

dat1 <- microbenchmark(
dtbl<- data.table(diamonds)[, list(depth=mean(depth), table=mean(table)), by=color][order(-   depth)],
dplyr_dtbl <- arrange(summarise(group_by(tbl_dt(diamonds),color), depth = mean(depth) , table =  mean(table)),-depth),
dplyr_dtfr <- arrange(summarise(group_by(tbl_df(diamonds),color), depth = mean(depth) , table = mean(table)),-depth),
times = 20, 
unit = "ms"
)

Результаты показывают, что dplyr с tbl_dt немного медленнее, чем подход data.table.Однако dplyr с data.frame работает быстрее:

         expr       min        lq    median        uq       max neval
      data.table  9.606571 10.968881 11.958644 12.675205 14.334525    20
dplyr_data.table 13.553307 15.721261 17.494500 19.544840 79.771768    20
dplyr_data.frame  4.643799  5.148327  5.887468  6.537321  7.043286    20

Примечание. Я явно изменил имена, чтобы результаты микробенчмарка были более читабельными

...