2014-06-25 50 views
4

這是this question的稍後續。我想使用dplyr函數而不是ddply來應用一個函數,該函數會生成幾個直接包含在結果中的行。我想這是在下面的例子中最好的解釋:ddply - > dplyr:.fun =總結了幾行

library(plyr) 
#library(dplyr) 

dfx <- data.frame(
    group = c(rep('A', 8), rep('B', 15), rep('C', 6)), 
    sex = sample(c("M", "F"), size = 29, replace = TRUE), 
    age = runif(n = 29, min = 18, max = 54) 
    ) 

p <- c(.2,.4,.6,.8) 
ddply(dfx, .(group), .fun = summarize, p=p, stats=quantile(age,probs=p)) 
# dfx %>% group_by(group) %>% do(p=p, stats=quantile(.$age, probs=p)) 

的ddply的解決方案看起來像這樣(不加載dplyr這個工作):

# group p stats 
# 1  A 0.2 32.81104 
# 2  A 0.4 34.13195 
# 3  A 0.6 37.34055 
# 4  A 0.8 44.21874 
# 5  B 0.2 25.58858 
# 6  B 0.4 34.67511 
# 7  B 0.6 40.68370 
# 8  B 0.8 44.67346 
# 9  C 0.2 37.22625 
# 10  C 0.4 42.46769 
# 11  C 0.6 43.27065 
# 12  C 0.8 44.54724 

dplyr溶液(註釋行)產生以下結果:

# group  p stats 
# 1  A <dbl[4]> <dbl[4]> 
# 2  B <dbl[4]> <dbl[4]> 
# 3  C <dbl[4]> <dbl[4]> 

這裏,數據在列表元素中是「隱藏」的。有沒有辦法直接得到上面的ddply解決方案? (請注意,我張貼這個問題上manipulatr mailing list,至今沒有答案)

回答

7

檢查,如果這個工程: 輸出是不同的,因爲no set.seed

dfx %>% group_by(group) %>% do(data.frame(p=p, stats=quantile(.$age, probs=p))) 
Source: local data frame [12 x 3] 
Groups: group 

    group p stats 
1  A 0.2 27.68069 
2  A 0.4 35.36915 
3  A 0.6 39.15223 
4  A 0.8 46.41073 
5  B 0.2 34.68378 
6  B 0.4 37.22358 
7  B 0.6 40.76185 
8  B 0.8 44.48645 
9  C 0.2 33.86023 
10  C 0.4 36.30515 
11  C 0.6 46.80672 
12  C 0.8 52.82140 
4

我覺得你有被咬(如我)與dplyr v 0.2中的(新)do()語法相比,早期的0.1.3版本發生了顯着變化。

0.2 do()有兩種操作模式:

  1. 如果你不給它命名的參數,它會從它的...參數作爲數據幀返回結果。

  2. 如果你給它命名參數​​,它會返回參數do()作爲列表元素的結果。

請參閱?do的(可能)更精確的解釋,也是Hadley's blog on the release of v 0.2

+0

感謝您的解釋和鏈接,它幫助我瞭解@akrun的解決方案。 – sebschub

+0

哈德利斯博客的鏈接提供了迄今爲止我所見過的最有用的解釋。非常感謝你! – User632716