如何用一次tidyr::pivot_longer实现复杂列名的数据宽转长?
解决pivot_longer一次转换数据结构的问题
你的报错原因是正则表达式里存在三个捕获组:((eb\.estimate|se\.rescaled)) 里的外层括号是第一个捕获组,内部的选择分支是第二个,末尾的(\d{4})是第三个。而当names_to=".value"时,要求正则只能有一个捕获组对应要保留的列名前缀,因此触发错误。
要实现一次pivot转换,你可以利用names_to的向量参数,明确指定不同捕获组对应的用途:一个对应列名前缀(.value),一个对应年份列。具体代码如下:
all.data.long <- all.data %>% pivot_longer( cols = -survey_id, # 自动选中所有非survey_id的列,更简洁 names_to = c(".value", "year"), names_pattern = "(eb\\.estimate|se\\.rescaled)\\.(\\d{4})" ) %>% rename( eb.est = eb.estimate, se = se.rescaled )
代码说明:
cols = -survey_id:避免手动罗列所有需要转换的列,直接排除不需要变形的survey_idnames_to = c(".value", "year"):第一个捕获组的内容(eb.estimate或se.rescaled)作为新的列名,第二个捕获组的内容(年份)作为year列的取值names_pattern:将列名拆分为两部分,第一部分是指标类型,第二部分是年份rename:把原始指标列名重命名为你需要的eb.est和se
执行后就能直接得到你想要的目标数据结构,无需多次pivot再合并。
内容的提问来源于stack exchange,提问作者Stuart
相关产品推荐
相关产品推荐

