如何计算嵌套列表中每个城市的计数之和并使用map将其存储在新标签中?
嵌套列表的输出如下所示:
City:'s-Hertogenbosch`
$`'s-Hertogenbosch`$`5392`
$`'s-Hertogenbosch`$`5392`$men
A tibble: 20 x 2
age count
<chr> <dbl>
1 0 tot 5 jaar 20
2 5 tot 10 jaar 40
3 10 tot 15 jaar 45
4 15 tot 20 jaar 20
5 20 tot 25 jaar 25
$`'s-Hertogenbosch`$`5392`$women
A tibble: 20 x 2
age count
<chr> <dbl>
1 0 tot 5 jaar 15
2 5 tot 10 jaar 30
3 10 tot 15 jaar 35
4 15 tot 20 jaar 30
5 20 tot 25 jaar 15
City:'Aa en Hunze`
$`Aa en Hunze`
$`Aa en Hunze`$`9443`
$`Aa en Hunze`$`9443`$men
A tibble: 20 x 2
age count
<chr> <dbl>
1 0 tot 5 jaar 0
2 5 tot 10 jaar 10
3 10 tot 15 jaar 5
4 15 tot 20 jaar 5
5 20 tot 25 jaar 5
$`Aa en Hunze`$`9443`$women
A tibble: 20 x 2
age count
<chr> <dbl>
1 0 tot 5 jaar 5
2 5 tot 10 jaar 5
3 10 tot 15 jaar 5
4 15 tot 20 jaar 10
5 20 tot 25 jaar 5
我知道如何在标题中存储1个特定的邮政编码:
sum of count <- tibble(sum(data[[1]][[1]][[1]]['count']))
但我不知道如何将此应用于R中使用map的所有列表:
Get_count_per_postal <- map_int(data, function(x){
tibble(municipality = names(data), count_inhibitants = sum(data[[?]][[?]][[?]]['count']))
})
我很难访问嵌套列表并应用计算,如果有人给我指明正确的道路就太好了。
编辑:
`8044` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(110,
85, 60, 45, 20, 65, 130, 80, 70, 45, 25, 15, 15, 5, 0, 0, 0,
0, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df", "tbl",
"data.frame")), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(105,
80, 55, 35, 30, 105, 120, 80, 50, 35, 25, 10, 5, 5, 0, 0, 0,
0, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df", "tbl",
"data.frame")), migration = c(western_migration_background = 120,
non_western_migration_background = 195), households = c(single_households = 75,
multi_person_households_without_kids = 130, multi_person_households_with_kids = 310
)), `8045` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(0,
0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame")), women = structure(list(
age = c("0 tot 5 jaar", "5 tot 10 jaar", "10 tot 15 jaar",
"15 tot 20 jaar", "20 tot 25 jaar", "25 tot 30 jaar", "30 tot 35 jaar",
"35 tot 40 jaar", "40 tot 45 jaar", "45 tot 50 jaar", "50 tot 55 jaar",
"55 tot 60 jaar", "60 tot 65 jaar", "65 tot 70 jaar", "70 tot 75 jaar",
"75 tot 80 jaar", "80 tot 85 jaar", "85 tot 90 jaar", "90 tot 95 jaar",
"95 jaar of ouder"), count = c(0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -20L
), class = c("tbl_df", "tbl", "data.frame")), migration = c(western_migration_background = 0,
non_western_migration_background = 0), households = c(single_households = 5,
multi_person_households_without_kids = 5, multi_person_households_with_kids = 5
))))
R
> dput(sample(data, 1))
list(Alblasserdam = list(`2951` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(355,
360, 305, 335, 265, 285, 300, 255, 270, 310, 315, 300, 250, 260,
320, 235, 145, 85, 40, 10)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(335,
360, 295, 290, 270, 315, 285, 265, 305, 330, 345, 310, 265, 320,
345, 320, 205, 170, 90, 20)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), migration = c(western_migration_background = 630,
non_western_migration_background = 820), households = c(single_households = 1350,
multi_person_households_without_kids = 1395, multi_person_households_with_kids = 1580
)), `2952` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(30,
35, 40, 40, 30, 20, 20, 25, 30, 45, 50, 30, 15, 20, 10, 10, 0,
5, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df", "tbl",
"data.frame")), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(30,
35, 40, 60, 25, 30, 25, 30, 35, 50, 40, 25, 25, 15, 10, 10, 5,
5, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df", "tbl",
"data.frame")), migration = c(western_migration_background = 45,
non_western_migration_background = 20), households = c(single_households = 70,
multi_person_households_without_kids = 80, multi_person_households_with_kids = 175
)), `2953` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(200,
215, 200, 200, 175, 240, 200, 195, 180, 225, 275, 170, 125, 115,
115, 85, 55, 25, 5, 0)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(190,
185, 215, 175, 175, 215, 190, 190, 210, 230, 215, 160, 120, 130,
125, 120, 60, 30, 15, 0)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), migration = c(western_migration_background = 510,
non_western_migration_background = 600), households = c(single_households = 815,
multi_person_households_without_kids = 650, multi_person_households_with_kids = 1010
)), `2954` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(75,
70, 105, 100, 115, 75, 50, 55, 85, 90, 120, 125, 125, 85, 60,
25, 5, 5, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar",
"25 tot 30 jaar", "30 tot 35 jaar", "35 tot 40 jaar", "40 tot 45 jaar",
"45 tot 50 jaar", "50 tot 55 jaar", "55 tot 60 jaar", "60 tot 65 jaar",
"65 tot 70 jaar", "70 tot 75 jaar", "75 tot 80 jaar", "80 tot 85 jaar",
"85 tot 90 jaar", "90 tot 95 jaar", "95 jaar of ouder"), count = c(50,
90, 90, 105, 100, 50, 60, 60, 75, 100, 150, 110, 100, 75, 60,
20, 15, 5, 0, 0)), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame")), migration = c(western_migration_background = 160,
non_western_migration_background = 105), households = c(single_households = 180,
multi_person_households_without_kids = 345, multi_person_households_with_kids = 475
))))
Kr,Quido
结构不清楚。也许,递归选项会起作用-使用rrapply
通过melt
嵌套list
来改变结构,然后filter
列'L4'只有'count',unnest
list
列'value',做group_by
sum
(如果我们不想包括'L3'即sex
作为分组,删除它以获得每个'直辖市'的总计数
library(rrapply)
library(dplyr)
library(tidyr)
rrapply(data, how = 'melt') %>%
filter(L4 == 'count') %>%
unnest(value) %>%
group_by(municipality = L1, sex = L3) %>%
summarise(count_inhabitants = sum(value, na.rm = TRUE), .groups = 'drop')
# A tibble: 4 × 3
municipality sex count_inhabitants
<chr> <chr> <dbl>
1 City:'Aa en Hunze men 25
2 City:'Aa en Hunze women 30
3 City:'s-Hertogenbosch men 150
4 City:'s-Hertogenbosch women 125
更新使用OP的数据
library(purrr)
map_dfr(data, ~ map_dfr(.x, ~ map_dfr(.x[c("men", "women")],
~ sum(.x$count, na.rm = TRUE), .id = 'sex'), .id = 'id'),
.id = 'municipality')
# A tibble: 4 × 4
municipality id men women
<chr> <chr> <dbl> <dbl>
1 Alblasserdam 2951 5000 5440
2 Alblasserdam 2952 455 495
3 Alblasserdam 2953 3000 2950
4 Alblasserdam 2954 1370 1315
数据data <- list(`City:'s-Hertogenbosch` = list(`'s-Hertogenbosch$5392` = list(
men = structure(list(age = c("0 tot 5 jaar", "5 tot 10 jaar",
"10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar"), count = c(20,
40, 45, 20, 25)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -5L)), women = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar"
), count = c(15, 30, 35, 30, 15)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -5L)))), `City:'Aa en Hunze` = list(
`'Aa en Hunze$9443` = list(men = structure(list(age = c("0 tot 5 jaar",
"5 tot 10 jaar", "10 tot 15 jaar", "15 tot 20 jaar", "20 tot 25 jaar"
), count = c(0, 10, 5, 5, 5)), class = c("tbl_df", "tbl",
"data.frame"), row.names = c(NA, -5L)), women = structure(list(
age = c("0 tot 5 jaar", "5 tot 10 jaar", "10 tot 15 jaar",
"15 tot 20 jaar", "20 tot 25 jaar"), count = c(5, 5,
5, 10, 5)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-5L)))))