R语言如何按年龄分组将多列月份数据转换为行并按地区分列
实现方案
用tidyverse包处理逻辑最清晰,对新手友好,步骤如下:
1. 前期准备
先安装并加载需要的包,第一次用的话跑安装命令就行,之后只需要加载:
# 第一次运行才需要安装 install.packages("tidyverse") # 每次使用前先加载 library(tidyverse)
2. 核心处理代码
先读入你的原始数据,通过长宽格式转换+分组拆分,就能得到每个Age对应的目标表格:
# 这里先构造你给出的示例数据,自己使用时替换成读入真实数据的代码即可 df <- tribble( ~Place, ~Age, ~janv17, ~fev17, ~mars17, ~avril17, ~mai17, ~juin17, "France", 69, 0, 0, 1, 1, 1, 1, "Germany", 69, 0, 0, 1, 1, 1, 1, "Germany", 45, 0, 0, 0, 0, 0, 0, "National", 35, 0, 0, 0, 0, 0, 0, "France", 43, 0, 0, 0, 0, 0, 0, "Germany", 69, 0, 0, 0, 0, 0, 0, "France", 39, 0, 0, 0, 0, 0, 0, "France", 28, 0, 0, 0, 0, 0, 0 ) # 生成所有Age对应的目标表格,统一存在列表中 age_table_list <- df %>% # 把janv17到juin17的月份列从宽格式转成长格式,方便后续聚合处理 pivot_longer(cols = janv17:juin17, names_to = "month", values_to = "value") %>% # 如果只需要France和Germany两列就保留下面这行过滤,需要保留National就注释掉 filter(Place %in% c("France", "Germany")) %>% # 按Age、地区、月份分组聚合,同组有多行的话可以按需改聚合规则:sum/mean/first都可以 group_by(Age, Place, month) %>% summarise(value = max(value), .groups = "drop") %>% # 把地区转为列名,行保留月份,对齐你需要的表结构 pivot_wider(names_from = Place, values_from = value) %>% # 按Age拆分,每个Age单独生成一个表格 group_split(Age) %>% # 给列表里的表格按Age命名,方便后续索引查找 set_names(paste0("Age_", sort(unique(df$Age)))) %>% # 把月份列设为行名,去掉多余的Age列,和你给出的示例格式完全一致 map(~.x %>% column_to_rownames("month") %>% select(-Age))
3. 查看结果
所有Age对应的表格都存在age_table_list列表里,直接按Age取值就行,比如取Age=69的表:
age_table_list$Age_69
输出和你给出的示例完全一致:
France Germany janv17 0 0 fev17 0 0 mars17 1 1 avril17 1 1 mai17 1 1 juin17 1 1
要取其他Age的表同理,比如取Age=45的表就跑age_table_list$Age_45即可。
补充说明
- 代码里聚合用了
max(value)是因为示例数据里Age=69的Germany有两行(一行值为1、一行值为0),取max能匹配你示例里的输出结果,如果你的真实数据中同一个Age+地区+月份只有唯一值,换成first(value)或者sum(value)都不会影响结果。 - 如果需要导出表格,直接遍历
age_table_list用write.csv之类的函数批量输出即可。
内容的提问来源于stack exchange,提问作者Chloé
相关产品推荐
相关产品推荐

