【问题标题】:R Plyr - Ordering results from DDPLY?R Plyr - 从 DDPLY 订购结果?
【发布时间】:2011-04-30 03:24:05
【问题描述】:

有谁知道对 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)

【问题讨论】:

  • 我不确定你是否可以“即时”做一些事情——但只是一个随机注释,而不是ddims[order(-ddims$depth),],你可以试试ddims[order(ddims$depth, decreasing=TRUE),]。这样您就不必制作新的“负”矢量对象。

标签: r plyr


【解决方案1】:

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

【讨论】:

  • 谢谢伙计。我不知道data.table 包。看起来非常快,而且可读性也很强。我将在不久的将来使用一些大数据集,所以谢谢你。我要等着看是否有人提出ddply 的具体答案。
【解决方案2】:

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

【讨论】:

  • 这听起来很不合逻辑,看起来也不好看。通常这意味着错误的代码。这真的是要走的路吗?
  • 为什么不添加您自己的答案并展示更好的方法?
  • 我收到了您的评论,但我的帖子听起来比我预期的要负面。我来这里是因为这也是我的问题。我通过将我的数据框保存为df 解决了这个问题,然后做了一个df[ order(df$column, ]。因此,我首先将其保存到数据框中,然后对其进行排序。
【解决方案3】:

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

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

【讨论】:

  • 为什么大多数 R 问题的答案都是黑魔法?请解释 %.% 运算符的记录位置和/或它的作用。这不是您可以通过 Google 轻松找到的内容。
  • help("%.%", package = 'dplyr')
【解决方案4】:

聚会有点晚了,但使用 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"
)

结果显示 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

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

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2016-01-09
    • 2015-05-12
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多