ddply - > dplyr:.fun =用几行汇总

seb*_*hub 4 r plyr dplyr

这是对这个问题的一个有点跟进.我想使用dplyr函数而不是ddply应用一个函数,该函数产生直接包含在结果中的几行.我想这在以下示例中得到了最好的解释:

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))
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

dplyr溶液(注释行)产生以下:

#   group        p    stats
# 1     A <dbl[4]> <dbl[4]>
# 2     B <dbl[4]> <dbl[4]>
# 3     C <dbl[4]> <dbl[4]>
Run Code Online (Sandbox Code Playgroud)

这里,数据在列表元素中"隐藏".有没有办法直接获得上述ddply解决方案?(请注意,我在manipulatr邮件列表上发布了这个问题,到目前为止还没有答案.)

akr*_*run 7

检查是否有效:由于noset.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
Run Code Online (Sandbox Code Playgroud)


Pau*_*ens 5

我认为你被do()dplyr v 0.2 的(新)语法咬了(就像我一样),这个语法与之前的0.1.3版本有很大的不同.

0.2 do()有两种操作模式:

  1. 如果你不给它命名参数​​,它会将其...参数的结果作为数据框返回.

  2. 如果你给它命名参数​​,它将返回作为列表元素的...参数的结果do().

请查看?do(可能)更准确的解释以及Hadley关于v 0.2发布的博客.