如何用pivot_longer处理多模式列并生成visit_no计数列?
宽格式转长格式并生成访问次数标记
解决方案(R语言,tidyr包)
使用tidyr::pivot_longer函数,通过正则表达式匹配列名前缀和访问次数后缀,精准转换格式:
1. 准备示例数据
library(tidyr) # 构造你的宽格式数据集 wide_data <- data.frame( idno = c(20, 21, 22), sex = c("M", "F", "M"), age_1 = c(10, 11, 12), date_visit_1 = c("10/1/2010", "10/2/2010", "11/3/2010"), height_in_cm_1 = c(100, 90, 100), age_2 = c(11, 12, 13), date_visit_2 = c("10/1/2011", "11/3/2011", "12/4/2011"), height_in_cm_2 = c(110, 100, 105), age_3 = c(12, 13, 14), date_visit_3 = c("10/2/2012", "12/5/2012", "12/5/2012"), height_in_cm_3 = c(115, 105, 110) )
2. 执行格式转换
long_data <- wide_data %>% pivot_longer( cols = starts_with(c("age_", "date_visit_", "height_in_cm_")), # 选中所有带数字后缀的目标列 names_pattern = "(.*)_(\\d+)", # 正则捕获:(列名前缀)_(访问次数) names_to = c(".value", "visit_no"), # .value将前缀作为新列名,第二个捕获组作为visit_no values_drop_na = TRUE # 可选:自动剔除缺失值行 )
3. 转换后结果
执行后得到的long_data完全符合你期望的长格式:
idno sex age date_visit height_in_cm visit_no 1 20 M 10 10/1/2010 100 1 2 20 M 11 10/1/2011 110 2 3 20 M 12 10/2/2012 115 3 4 21 F 11 10/2/2010 90 1 5 21 F 12 11/3/2011 100 2 6 21 F 13 12/5/2012 105 3 7 22 M 12 11/3/2010 100 1 8 22 M 13 12/4/2011 105 2 9 22 M 14 12/5/2012 110 3
关键参数说明
names_pattern = "(.*)_(\\d+)":正则表达式精准拆分列名,(.*)捕获下划线前的列名前缀(如age、date_visit),(\\d+)捕获下划线后的数字(访问次数)。names_to = c(".value", "visit_no"):.value是特殊关键字,告诉函数将相同前缀的列合并为一个值列;第二个元素visit_no指定数字后缀对应的新列名。
内容的提问来源于stack exchange,提问作者Agnes Flack
相关产品推荐
相关产品推荐

