计算在分组数据框中找到的所有值

时间:2018-07-02 23:08:21

标签: r dplyr grouping

假设我有一些人口统计数据

demographic.data <- data.frame(nation=c('us', 'us', 'us', 'us', 'us', 'china', 'china', 'china'),
                               religion=c('christ', 'budhist', 'christ', 'jew', 'jew', 'christ', 'budhist', 'budhist'))

#  nation religion
#1     us   christ
#2     us  budhist
#3     us   christ
#4     us      jew
#5     us      jew
#6  china   christ
#7  china  budhist
#8  china  budhist

我想计算每个国家宗教的质量函数。因此,我可以对某个国家进行类似group_by()的操作,然后通过一堆sum()进行汇总。

religion.distributions <- demographic.data %>%
  group_by(nation) %>%
  summarise(n       = n(),
            christ  = sum(religion == 'christ'),
            jew     = sum(religion == 'jew'),
            budhist = sum(religion == 'budhist'))

#  nation     n christ   jew budhist
#
#1 china      3      1     0       2
#2 us         5      2     2       1

尽管这会为该数据产生正确的结果,但问题是我需要对我想总结的宗教进行硬编码。如果数据中出现任何新的宗教信仰,这将是一个问题。

有没有一种方法可以自动 列出各组中每种宗教的人数?它应该能够查看religion列中的所有可能值并开始对其进行计数。使用dplyr管道的解决方案将是最优雅的。

1 个答案:

答案 0 :(得分:1)

我们可以将spreadcount一起使用

library(tidyverse)
demographic.data %>% 
    group_by(nation) %>% 
    mutate(n = n()) %>% 
    count(nation, religion, n) %>% 
    spread(religion, nn, fill = 0)
# A tibble: 2 x 5
# Groups:   nation [2]
#  nation     n budhist christ   jew
#  <fct>  <int>   <dbl>  <dbl> <dbl>
#1 china      3       2      1     0
#2 us         5       1      2     2