如何为tidyr::pivot_longer设置names_pattern实现指定宽表转长表
解决方法
你当前的names_to参数设置不符合需求,目标是生成first和last列,需要调整参数并搭配正确的正则表达式作为names_pattern取值:
正确代码及解释
df_wide %>% tidyr::pivot_longer( cols = -name, names_to = c(".value", "group"), names_pattern = "(first|last)_name(?:_(\\d+))?" ) %>% dplyr::select(-group) # 可选:移除不需要的分组序号列
关键参数说明
names_to = c(".value", "group"):.value表示用正则捕获的第一部分(first或last)作为新列名,自动将所有first_name*列合并为first列,last_name*列合并为last列group用来接收捕获的数字序号(对应_1/_2这类后缀),后续可按需移除
names_pattern = "(first|last)_name(?:_(\\d+))?":(first|last):捕获列名前缀,区分是名字还是姓氏_name:匹配列名中的固定字符串部分(?:_(\\d+))?:可选匹配带数字的后缀,?:表示外层是非捕获组,\\d+捕获数字序号,?允许这部分不存在(对应无后缀的first_name/last_name列)
简化版(无需保留分组序号)
如果不需要分组序号,也可以用更简洁的正则:
df_wide %>% tidyr::pivot_longer( cols = -name, names_to = ".value", names_pattern = "(first|last)_name.*" )
这种方式通过匹配first_name或last_name开头的所有列,直接合并为first和last列,适合列顺序固定的场景。
内容的提问来源于stack exchange,提问作者Canovice
相关产品推荐
相关产品推荐

