在R中同时对多个变量进行数据透视操作
R数据框宽转长(按列名前缀拆分)
可以用tidyverse中的tidyr::pivot_longer函数高效解决这个问题,完美适配你这种列名遵循[指标]_[时间状态]模式的宽格式数据:
# 先加载tidyverse包 library(tidyverse) # 给原数据添加观测编号 df <- df %>% mutate(obs.number = row_number()) # 执行宽转长操作 pivot_result <- df %>% pivot_longer( cols = -obs.number, # 排除观测编号列,处理其余所有列 names_to = c(".value", "status"), # 拆分列名:前缀作为新列名,后缀存入status列 names_sep = "_" # 按下划线拆分列名 ) %>% select(obs.number, residence, family, status) # 调整列顺序与目标格式一致
代码说明
mutate(obs.number = row_number()):为每一行生成唯一的观测编号,对应目标数据中的obs.number列。pivot_longer是核心函数:names_to = c(".value", "status"):.value是特殊关键字,代表将拆分后的前缀部分作为新的列名(比如residence、family),后缀部分(pre/during/after)则存入status列。names_sep = "_":指定列名的拆分分隔符为下划线。
select用于调整列的顺序,确保和你期望的输出结构完全匹配。
如果你的真实数据有更多遵循相同命名模式的列,这个代码无需修改就能直接适用,pivot_longer会自动处理所有符合规则的列。
内容的提问来源于stack exchange,提问作者Monelisa
相关产品推荐
相关产品推荐

