2014-06-25 110 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