假设我有一些人口统计数据
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
管道的解决方案将是最优雅的。
答案 0 :(得分:1)
我们可以将spread
与count
一起使用
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