在R语言中将宽格式数据转换为长格式的技术求助
宽格式转指定长格式的解决方案
你可以用tidyr包的pivot_longer()函数来实现需求,这个函数能精准匹配成对的宽格式列(var_ma_*和diff_*),并生成对应的visit列。
步骤1:准备依赖包
如果未安装tidyr,先执行安装:
install.packages("tidyr")
加载包:
library(tidyr)
步骤2:执行数据重塑
运行以下代码:
df_long <- df1 %>% pivot_longer( cols = starts_with(c("var_ma_", "diff_")), # 选中需要转长的成对列 names_to = c(".value", "visit"), # 拆分列名:前缀作为新值列名,数字作为visit编号 names_pattern = "(var_ma|diff)_(\\d+)", # 正则匹配列名的前缀和数字部分 values_drop_na = TRUE ) %>% select(id_male, id_female, visit, var_ma, diff, var) # 调整列顺序至目标格式
代码说明
cols = starts_with(...):筛选所有以var_ma_或diff_开头的列,即需要转长的目标列。names_to = c(".value", "visit"):.value表示将列名的前缀(var_ma/diff)作为新列的名称,visit表示将列名中的数字作为该列的取值。names_pattern = "(var_ma|diff)_(\\d+)":用正则表达式拆分列名,第一组匹配前缀,第二组匹配数字编号。select(...):调整列的顺序,和你需要的输出格式完全对齐。
输出示例
运行后得到的结果与目标格式一致,比如原数据中id_male=1的行会被拆分为4行:
id_male id_female visit var_ma diff var 1 1 522 1 839 904 1 2 1 522 2 996 888 1 3 1 522 3 866 333 1 4 1 522 4 661 701 1
内容的提问来源于stack exchange,提问作者llxx2021
相关产品推荐
相关产品推荐

