2011-04-30 50 views
6

有沒有人知道一個爽快的方式來命令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

回答

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 - 出於速度的原因。

+0

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

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 
+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

1

有點遲到了,但事情可能與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 

注:我已經明顯改變了名字,這樣的微基準測試結果更具可讀性

3

如果使用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