2016-03-28 28 views
3

我希望能夠使用dplyr的拆分應用組合策略來應用summary()命令。使用dplyr's do()with summary()

舉一個簡單的數據幀:

df <- data.frame(class = c('A', 'A', 'B', 'B'), 
       value = c(100, 120, 800, 880)) 

理想的情況下,我們會做這樣的事情:

df %>% 
    group_by(class) %>% 
    do(summary(.$value)) 

可惜,這是行不通的。有任何想法嗎?

回答

4

問題是dplyrdo()只適用於輸入形式data.frame

broom packagetidy()函數可用於將summary()的輸出轉換爲data.frame

df %>% 
    group_by(class) %>% 
    do(tidy(summary(.$value))) 

這給:

Source: local data frame [2 x 7] 
Groups: class [2] 

    class minimum q1 median mean q3 maximum 
    (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
1  A  100 105 110 110 115  120 
2  B  800 820 840 840 860  880 
2

do的行爲將根據您是否給它一個有名或無名的參數而改變。對於未命名的參數,它需要爲每個組綁定一個data.frame。對於命名參數,它將爲每個組創建一行,並將輸出的內容放入具有該名稱的新變量中。

所以在這種情況下,我們會抱怨未命名的使用(summary不會產生data.frame),但命名使用將工作:

df %>% 
    group_by(class) %>% 
    do(summaries = summary(.$value)) -> 
    df2 

其中給出:

Source: local data frame [2 x 2] 
Groups: <by row> 

    class     summaries 
    (fctr)      (chr) 
1  A <S3:summaryDefault, table> 
2  B <S3:summaryDefault, table> 

我們可以訪問像這樣的總結:

df2$summaries[[1]] 

給:

Min. 1st Qu. Median Mean 3rd Qu. Max. 
100  105  110  110  115  120 

讓所有的df這些作爲新列,只能通過第一輸出轉換爲data.frame來完成,如可以在其他的答案中可以看出。

所以這裏問題的根源在於summary輸出的是table而不是data.frame。

+1

感謝,這是偉大的。我剛剛遇到的另一種方法是使用掃帚包中的'tidy()'函數。但是命名它是避免這種情況的一種非常簡單的方法。 –

4

您可以使用data_frame的SE版本,也就是data_frame_並執行:

df %>% 
    group_by(class) %>% 
    do(data_frame_(summary(.$value))) 

或者,你可以使用as.list()包裹由data.frame()的說法check.names = FALSE

df %>% 
    group_by(class) %>% 
    do(data.frame(as.list(summary(.$value)), check.names = FALSE)) 

兩個版本產生:

# Source: local data frame [2 x 7] 
# Groups: class [2] 
# 
# class Min. 1st Qu. Median Mean 3rd Qu. Max. 
# (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
# 1  A 100  105 110 110  115 120 
# 2  B 800  820 840 840  860 880 
+0

謝謝,這個輸出看起來很完美。我已經閱讀了一下SE,但從未完全理解它。這些功能屬於哪個軟件包?從使用'_'它看起來像@hadley之一。我還發現了一種使用掃帚包中的'tidy()'的方法。見下文。 –

+2

'data_frame'和'data_frame_'來自'dplyr'。順便說一句,就我而言,這個答案應該是對號。 – Axeman

+0

謝謝,這是有道理的。感謝您的志願者,我改變了它。 –