【问题标题】:ddply -> dplyr: .fun = summarize with several rowsddply -> dplyr: .fun = 用几行总结
【发布时间】:2014-06-25 09:42:04
【问题描述】:

这是this question 的一些后续行动。我想使用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))

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 上发布了这个问题,到目前为止还没有答案。)

【问题讨论】:

    标签: r plyr dplyr


    【解决方案1】:

    检查这是否有效: 由于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
    

    【讨论】:

      【解决方案2】:

      我认为您(和我一样)被 dplyr v 0.2 中的(新)do() 语法所困扰,该语法与早期的 0.1.3 版本相比发生了显着变化。

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

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

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

      请参阅?do 以获得(可能)更准确的解释以及Hadley's blog on the release of v 0.2

      【讨论】:

      • 感谢您的解释和链接,它帮助我理解了@akrun 的解决方案。
      • Hadleys 博客的链接提供了迄今为止我所见过的最有用的解释。非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多