R Plyr - 从DDPLY订购结果?

时间:2011-04-30 03:24:05

标签: r plyr

是否有人知道一种灵活的方式来订购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()中做得很好。谁知道怎么做?

Hadley的ggplot2书有ddply和子集的这个例子,但它实际上并没有对输出进行排序,只是选择每组最小的两颗钻石。

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

4 个答案:

答案 0 :(得分:7)

我将利用这个机会为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 - 出于速度原因。

答案 1 :(得分:3)

是的,要排序,您可以将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

答案 2 :(得分:3)

如果您使用dplyr,我建议您使用%.%运算符,该运算符会读取更直观的代码。

data(diamonds, package = 'ggplot2')
library(dplyr)
diamonds %.%
  group_by(color) %.%
  summarise(
    depth = mean(depth),
    table = mean(table)
  ) %.%
  arrange(desc(depth))

答案 3 :(得分:1)

派对有点晚了,但dplyr可能会有些不同。借用crayola的data.stable解决方案:

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方法稍慢。但是,带有data.frame的dplyr更快:

         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

注意:我显然已经更改了名称,因此微基准测试结果更具可读性