能否在pivot_longer()中指定多值列以简化宽转长数据操作?
能否在
pivot_longer()中指定多值列? 当然可以,完全不用配合pivot_wider(),单步pivot_longer()就能搞定。核心是用tidyr里的.value特殊标记,直接把列名拆分出变量名和分组标识。
直接实现的代码
df_return <- dfa %>% pivot_longer( cols = !id, names_to = c(".value", "report"), names_pattern = "([a-z0-9]+)_(.*)", values_drop_na = TRUE )
关键逻辑解释
names_to里的.value是核心:它告诉函数,列名中匹配正则第一组([a-z0-9]+)的部分(也就是pts、p1到p5、d1到d5这些变量名)要作为最终结果的列名。- 正则的第二组
(.*)会匹配列名里的年份(比如2006),这些值会被存入report列。 - 这样处理后,每个
id+report的组合会自动对应所有变量的取值,直接生成你需要的长格式数据,和原来两步法的结果完全一致。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

