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)
我会利用这个机会来宣传位为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'特定的答案加入。 – 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
这听起来很unlogic,看起来不太好。通常这意味着错误的代码。这真的是要走的路吗? – CousinCocaine 2014-04-11 18:58:37
为什么不添加自己的答案并显示更好的方法? – Ben 2014-04-12 03:34:01
我收到您的评论,我的帖子听起来比我想要的更负面。我来到这里是因为这也是我的问题。我通过将数据框保存为'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))
为什么大多数R问题的答案黑魔法?请解释%。%操作符在哪里被记录和/或它在做什么。这不是Google轻易找到的。 – reinierpost 2015-03-06 15:36:20
'help(“%。%”,package ='dplyr')' – Ramnath 2015-03-09 17:10:23
这有助于, 谢谢! – reinierpost 2015-03-10 10:44:50
看那安排功能 – hadley 2011-04-30 13:10:35
我不知道有什么东西你可以做“对飞” - 但只是一个随机的音符,而不是'ddims [顺序(-ddims $深度),]' ,你可以尝试'ddims [order(ddims $ depth,decrease = TRUE),]'。这样你就不必制作一个新的'负面'矢量对象。 – 2011-04-30 18:16:12