R中的ddply小计

Posted

技术标签:

【中文标题】R中的ddply小计【英文标题】:subtotal with ddply in R 【发布时间】:2015-01-15 22:01:35 【问题描述】:

我在 R 中使用 ddply 并以两种不同的方式分解数据,但我想要两者的小计。 这是我正在使用的功能

    require(plyr)
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)
)

# Note the use of the '.' function to allow
# group and sex to be used without quoting
ddply(dfx, .(group, sex), summarize,
 mean = round(mean(age), 2),
 sd = round(sd(age), 2))

我还想按组汇总 (mean, sd) 和整个数据集的 (mean,sd) 汇总。有没有办法将它包含在同一个 ddply 中?

【问题讨论】:

请提供一个可重现的例子,包括data 在一次调用中获取所有数据是否重要,是否值得像答案中所做的那样复制数据?将三个分组调用绑定在一起有什么缺点? 【参考方案1】:

这不是plyr,而是dplyr 建议。如果我没记错的话,您需要 1) 组 * 性别、2) 组和 3) 整个数据集的均值和 sd。如果你不想让你的数据变大,你可以尝试这样的事情。

library(dplyr)

bind_rows(summarise_each(group_by(dfx, group, sex), funs(mean, sd)), 
          summarise_each(group_by(dfx, group), funs(mean, sd), age),
          summarise_each(dfx, funs(mean, sd), age))

您可以使用三个summarise_each 函数以您想要的方式汇总数据。然后,使用bind_rows 将它们全部绑定,dplyr (dplyr 0.4) 的开发版本中提供。如果您需要修改 NA,您可以稍后再进行。

#   group sex     mean        sd
#1      A   F 40.81629  9.190859
#2      A   M 34.27423 10.408674
#3      B   F 28.94309  9.002275
#4      B   M 37.70992 11.606198
#5      C   F 41.36827  8.796248
#6      C   M 38.16745  8.912859
#7      A  NA 36.72750  9.874593
#8      B  NA 34.20319 11.210715
#9      C  NA 39.76786  8.111645
#10    NA  NA 36.05086 10.192498

【讨论】:

这是我在上面问的时候想到的;很好的答案:) @Avraham 感谢您的评论。我想避免使数据变大。你的评论给了我灵感。 :)【参考方案2】:

您可以复制数据 4 次: - 包括性别和群体 - 包括性 - 包括团体 - 不包括任何列

未包含的列变为“全部”

require(plyr)
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)
)

# replicate the data not taking account of one or more attributed
dfAll <- dfx
dfAll$group <- "all"
dfAll$sex <- "all"
dfGroup <- dfx
dfGroup$group <- "all_group"
dfSex <- dfx
dfSex$group <- "all_sex"
dfToGroup <- rbind(dfx, dfGroup, dfSex, dfAll)

# Note the use of the '.' function to allow
# group and sex to be used without quoting
ddply(dfToGroup, .(group, sex), summarize,
      mean = round(mean(age), 2),
      sd = round(sd(age), 2))

【讨论】:

谢谢!正在寻找一种更简单的方法来自动化处理不同类型的数据......但它会在此期间工作

以上是关于R中的ddply小计的主要内容,如果未能解决你的问题,请参考以下文章

R:data.table 中的透视和小计?

小计取决于 r 中的多个列

从 R 中的数据透视表库呈现的数据透视表中删除小计和总计

R语言利器之ddply和aggregate

在 R 中分组时没有得到小计

在我的包中使用例如 ddply 时,如何摆脱 R CMD 检查生成的注释?