You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:57:21