使用收集和传播在行和列上聚合数据

时间:2018-10-24 09:35:48

标签: r aggregate tidyr spread

我有一个包含人口信息的数据集。在我的原始数据集中,每一行都是一个人,每一列都是一个变量:

  • 区(CBSWIJKCD
  • 社区(CBSBUURTCD
  • 年龄类别(Leeftijd_5jr
  • 日期(mutdat

我想汇总这些数据,以便每一行代表一个地区或邻里,而各列则代表:

  • 区/社区(SoortRegio
    • 此外,地区/社区的名称(Naam
  • 居民总数(TotaalInwoners
  • 每个年龄段(0-45-9等)中的总人数
  • 日期(mutdat

,并且在各列中每个年龄类别的居民总数和总人数。请参阅下面的示例。

我遇到的问题是,当我收集地区/邻里列时,我的行不再代表每个人,因此在dplyr语句中使用n()进行计数是没有意义的。

原始数据示例:

   CBSWIJKCD     mutdat     CBSBRTCD Leeftijd_5jr
   <chr>         <date>     <chr>    <chr>       
 1 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 2 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 3 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 4 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 5 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 6 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 7 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 8 Graft-De Rijp 2018-01-01 De Rijp  0-4         
 9 Graft-De Rijp 2018-01-01 De Rijp  0-4         
10 Graft-De Rijp 2018-01-01 De Rijp  0-4

所需数据的外观:

# A tibble: 76 x 26
   mutdat     SoortRegio Naam  InwonerAantal `0-4` `10-14` `104+` `15-19` `20-24` `25-29` `30-34` `35-39` `40-44`
   <date>     <chr>      <chr>         <int> <int>   <int>  <int>   <int>   <int>   <int>   <int>   <int>   <int>
 1 2018-01-01 CBSWIJKCD  Graft-De Rijp  1426  83      88     NA      84      58      68      78      95     111
 2 2018-01-01 CBSBRTCD   De Rijp        2022  107     102    NA      92      71      75      76     120     137
 3 2018-01-01 CBSBRTCD   Schermer       1431  85      93     NA      99      98      74      73      83      92
 4 2018-01-01 CBSBRTCD   Bergermeer     49    2       4      NA       4       2       1       3       2       5
 5 2018-01-01 CBSBRTCD   Boekelemeer    2963  117     91     NA     100     192     388     277     225     196

DPUT我正在处理的数据样本

structure(list(CBSWIJKCD = c("West", "Graft-De Rijp", "Daalmeer/Koedijk", 
"Zuid", "Daalmeer/Koedijk", "Graft-De Rijp", "Oudorp", "De Mare", 
"Oudorp", "Centrum", "Schermer", "De Mare", "Zuid", "Centrum", 
"Overdie", "West", "Oudorp", "De Mare", "West", "West"), CBSBRTCD = c("De Hoef I en II", 
"De Rijp", "Daalmeer-Noordwest", "Bloemwijk en Zocherkwartier", 
"Daalmeer-Zuidwest", "De Rijp", "Oudorperpolder-Zuid", "De Mare", 
"Oudorperpolder-Midden", "Spoorbuurt", "Schermerhorn", "t Rak-Noord", 
"Kooimeer", "Binnenstad-Oost", "Oud-Overdie", "De Hoef III en IV", 
"Oudorperpolder-Midden", "De Horn-Noord", "De Hoef III en IV", 
"Bergermeer"), Leeftijd_5jr = c("30-34", "10-14", "30-34", "45-49", 
"60-64", "75-79", "70-74", "85-89", "65-69", "70-74", "50-54", 
"60-64", "35-39", "40-44", "20-24", "10-14", "15-19", "70-74", 
"65-69", "15-19"), mutdat = structure(c(17532, 17532, 17532, 
17532, 17532, 17532, 17532, 17532, 17532, 17532, 17532, 17532, 
17532, 17532, 17532, 17532, 17532, 17532, 17532, 17532), class = "Date")), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

我已经尝试过:

library(tidyverse)

df3 <- df2 %>% 
  gather(key = "SoortRegio", value = "Naam", CBSWIJKCD:CBSBRTCD, -mutdat, -Leeftijd_5jr) %>% 
  group_by(Naam) %>% 
  mutate(InwonerAantal = n()) %>% 
  ungroup()

df4 <- df3 %>% 
  group_by(SoortRegio, Naam, Leeftijd_5jr) %>% 
  mutate(aantal = n()) %>% 
  ungroup() %>% 
  unique() %>% 
  spread(Leeftijd_5jr, aantal)

但是,当对CBSWIJKCD进行过滤并计算数量时(我应该以108475人结束),我得到110951。

0 个答案:

没有答案