【问题标题】:r dplyr summarise multiple factors countsr dplyr 汇总多个因素计数
【发布时间】:2016-06-14 13:06:46
【问题描述】:

我有一个我想总结的数据框,使用 dplyr。在数据框中有多个因素,我想报告每个组汇总的每个因素级别的计数。

有没有一种方法可以使用 dplyr 执行以下操作,而不必在汇总语句中命名每个因子级别。

库(dplyr)

set.seed(123)

s <- rbinom(100,1,0.5)
s <- factor(s,0:1,c('M','F'))
a <- sample(1:4,100,TRUE)
a <- factor(a,1:4,c('oldest','old','young','youngest'))
w <- rnorm(100,40,10)
g <- rep(1:2,each=50)

df <- data.frame(sex=s, age=a, weight=w, group=g)



sm <- df %>% group_by(group) %>% summarise(
  male = sum(ifelse(sex=='M',1,0))
  ,female = sum(ifelse(sex=='F',1,0))
  ,youngest = sum(ifelse(age=='youngest',1,0))
  ,young = sum(ifelse(age=='young',1,0))
  ,old = sum(ifelse(age=='old',1,0))
  ,oldest = sum(ifelse(age=='oldest',1,0))
  ,weight = mean(weight)
)

print(t(sm))

结果:

        [,1]     [,2]
group     1.000  2.00000
male     29.000 24.00000
female   21.000 26.00000
youngest 12.000  8.00000
young    13.000 17.00000
old      12.000 18.00000
oldest   13.000  7.00000
weight   37.461 40.38807

【问题讨论】:

  • 第二行的x是什么?
  • 你可以避开ifelse,直接在逻辑向量上做sum
  • x 是一个错字,应该改...

标签: r dplyr


【解决方案1】:

使用 dplyr(尽管是以一种迂回、笨拙的方式!):

df %>%
    mutate(row_number1 = row_number(), row_number2 = row_number()) %>%
    spread(sex, row_number1) %>%
    spread(age, row_number2) %>%
    group_by(group) %>%
    mutate_each(funs(ifelse(is.na(.), 0, 1)), -weight) %>%
    mutate(count = 1) %>%
    summarize_each(funs(sum)) %>%
    mutate(weight = weight / (count)) %>%
    select(-count) %>%
    t()

结果:

           [,1]     [,2]
group     1.000  2.00000
weight   37.461 40.38807
M        25.000 28.00000
F        25.000 22.00000
oldest   13.000  7.00000
old      12.000 18.00000
young    13.000 17.00000
youngest 12.000  8.00000

【讨论】:

  • 非常hacky,但我喜欢它。
  • 谢谢!我可能会考虑拆分因子和连续变量,这样可以避免手动计算均值。
【解决方案2】:

我假设对于您想要表格的因素,对于数字(例如weight)您想要平均值。

这个,不使用 dplyr,做你想要的,虽然结果可能不是你喜欢的格式。

sapply(df, function(x) if (is.factor(x)) table(x, df$group) else tapply(x, df$group, mean))

您可能还想查看reporttools 包,包括tableNominaltableContinuous

【讨论】:

  • 您的脚本生成了正确的数字,但我的脚本的目标是生成一个可发布的表格。
  • 我也很怀疑。你研究过报告工具吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多