如何使用pivot_longer对多组同命名规则列完成宽表转长表
原代码问题说明
- 第一种写法错误:
拆分逻辑与列赋值完全反向,正则(?=[0-9])会把Time1Day拆分为Time和1Day两部分,你错误地将这两部分赋值给了Day、Month字段,同时未使用.value特殊参数,无法同时生成Day、Month两个独立值列。 - 第二种写法错误:
连续两次调用pivot_longer会产生笛卡尔积,相同Time前缀的Day、Month值无法正确匹配,会生成大量重复错误的行。
正确实现代码
核心逻辑是用names_pattern配合.value特殊参数,拆分列名的同时自动生成对应的值列:
df.long <- df %>% pivot_longer( cols = starts_with("Time"), names_to = c("Time", ".value"), names_pattern = "(Time\\d)(Day|Month)", values_drop_na = TRUE )
参数说明
names_pattern设置两个捕获组,第一个组(Time\\d)匹配Time1/Time2/Time3这类时间标识,对应赋值给names_to的第一个参数Time,生成Time列- 第二个捕获组
(Day|Month)匹配度量类型,对应names_to的.value参数,系统会自动将匹配到的内容作为新的值列名,把对应数值分别存入Day、Month列 values_drop_na = TRUE自动过滤掉Time3中id-3的NA行,输出结果与你的预期完全一致
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

