【问题标题】:Count all values found within a grouped dataframe计算在分组数据框中找到的所有值
【发布时间】:2018-07-03 07:10:30
【问题描述】:

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

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()s聚合。

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 管道的解决方案将是最优雅的。

【问题讨论】:

    标签: r dplyr grouping


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多