R中的ddply小计
subtotal with ddply in R
我在 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 中?
您可以复制数据4次:
- 包括性别和群体
- 包括性
- 包括组
- 不包括任何列
未包含的列变为"all"
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))
这不是 plyr
,而是 dplyr
建议。如果我没记错的话,您需要 1) group * sex、2) group 和 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
函数以您想要的方式汇总数据。然后,使用 dplyr
(dplyr 0.4) 的开发版本中可用的 bind_rows
将它们全部绑定。如果需要修改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
我在 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 中?
您可以复制数据4次: - 包括性别和群体 - 包括性 - 包括组 - 不包括任何列
未包含的列变为"all"
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))
这不是 plyr
,而是 dplyr
建议。如果我没记错的话,您需要 1) group * sex、2) group 和 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
函数以您想要的方式汇总数据。然后,使用 dplyr
(dplyr 0.4) 的开发版本中可用的 bind_rows
将它们全部绑定。如果需要修改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