R Plyr - 从DDPLY订购结果?

问题描述:

有没有人知道一个爽快的方式来命令ddply总结操作的结果?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) 
+2

看那安排功能 – hadley 2011-04-30 13:10:35

+0

我不知道有什么东西你可以做“对飞” - 但只是一个随机的音符,而不是'ddims [顺序(-ddims $深度),]' ,你可以尝试'ddims [order(ddims $ depth,decrease = TRUE),]'。这样你就不必制作一个新的'负面'矢量对象。 – 2011-04-30 18:16:12

我会利用这个机会来宣传位为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 - 出于速度的原因。

+0

感谢队友。我不知道'data.table'包。看起来很快,而且很容易理解。我会在不久的将来使用一些大数据集,所以非常感谢。我将等待看看是否有人用'ddply'特定的答案加入。 – 2011-04-30 08:28:57

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

这听起来很unlogic,看起来不太好。通常这意味着错误的代码。这真的是要走的路吗? – CousinCocaine 2014-04-11 18:58:37

+0

为什么不添加自己的答案并显示更好的方法? – Ben 2014-04-12 03:34:01

+0

我收到您的评论,我的帖子听起来比我想要的更负面。我来到这里是因为这也是我的问题。我通过将数据框保存为'df'解决了这个问题,然后做了一个'df [order(df $ column,]'。因此,我首先将它保存到一个数据框中,然后命令它。 – CousinCocaine 2014-04-12 20:13:00

有点迟到了,但事情可能与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 

注:我已经明显改变了名字,这样的微基准测试结果更具可读性

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

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

为什么大多数R问题的答案黑魔法?请解释%。%操作符在哪里被记录和/或它在做什么。这不是Google轻易找到的。 – reinierpost 2015-03-06 15:36:20

+1

'help(“%。%”,package ='dplyr')' – Ramnath 2015-03-09 17:10:23

+0

这有助于, 谢谢! – reinierpost 2015-03-10 10:44:50