如何使用pivot_longer单次操作将宽表转换为多列长表?
回答
可以仅用单次pivot_longer命令完成转换,无需多次调用,核心是利用pivot_longer支持多组变量同时重塑的特性,具体实现如下:
核心代码
# 加载所需包 library(tidyr) library(magrittr) # 若已加载tidyverse则无需单独加载 # 单次pivot_longer实现转换 res <- df %>% pivot_longer( cols = everything(), # 选中所有待转换列 names_to = c(".value", "z"), # 第一部分拆分结果作为新列名,第二部分存入z列 names_pattern = "^([xy])(\\d)$", # 正则拆分原列名:前缀x/y + 后缀数字 names_transform = list(z = as.integer) # 将z列从默认字符类型转为整数类型 )
代码说明
names_to中传入的特殊标记.value会告诉pivot_longer,把列名拆分后对应位置的内容作为新生成的列名,这里拆分后的第一部分是x/y,就会自动生成x、y两列存储对应的值names_pattern用正则把原列名拆成两个捕获组,第一个组匹配x或y,第二个组匹配末尾的数字,正好对应names_to的两个参数- 转换后的数据行数为原行数*3,结构、数值和你给出的目标结果完全一致,是当前最简便的实现方式。
内容的提问来源于stack exchange,提问作者Jhonathan
相关产品推荐
相关产品推荐

