7

有谁知道一种巧妙的方法来订购 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

4 回答 4

8

我将利用这个机会为 做一些广告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

尽管我对 Hadley 的出色工作(例如 onggplot2和一般令人敬畏)怀有崇高的敬意,但我必须承认,出于速度的原因,对我来说,它data.table完全被取代了。ddply

于 2011-04-30T07:25:00.623 回答
4

是的,要进行排序,您可以将其嵌套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
于 2013-02-06T20:23:17.560 回答
3

如果您正在使用dplyr,我建议您利用%.%运算符,它可以读取更直观的代码。

data(diamonds, package = 'ggplot2')
library(dplyr)
diamonds %.%
  group_by(color) %.%
  summarise(
    depth = mean(depth),
    table = mean(table)
  ) %.%
  arrange(desc(depth))
于 2014-01-27T18:41:16.213 回答
1

聚会有点晚了,但使用 dplyr 可能会有所不同。借用绘儿乐的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"
)

结果表明,使用 tbl_dt 的 dplyr 比 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

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

于 2014-01-27T16:43:06.390 回答