是否有人知道一种灵活的方式来订购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)
答案 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
注意:我显然已经更改了名称,因此微基准测试结果更具可读性