R语言中使用pivot_longer实现多组配对列宽表转长表
正确实现代码
library(tidyverse) # 原始数据 df <- data.frame(area = c(1,2,3), cust1_LastName = c("Jack", "Sam", "Mary"), cust1_Money = c(10,40,50), cust2_LastName = c("Jane", "Kevin", "John"), cust2_Money = c(5,20,30)) # 转换逻辑 df2 <- df %>% pivot_longer( cols = -area, # 保留area列不参与长宽转换 names_to = c("cust_group", ".value"), # 第一个捕获组存客户分组标识,第二个捕获组的值作为新列名 names_pattern = "(cust\\d+)_(.*)" # 匹配列名的「客户分组_属性」结构 ) %>% # 按需求重命名列 rename( customer = LastName, money_spend = Money ) %>% # 不需要客户分组标识可删除该列 select(-cust_group)
错误原因说明
- 原代码的
names_pattern正则无法匹配列名结构:你的原始列名遵循custN_属性名的规则,正则需要拆分出「客户分组标识」和「属性名」两个部分,(cust\\d+)_(.*)的第一个捕获组匹配cust+数字的分组标识,第二个捕获组匹配下划线后的属性名。 names_to的顺序设置错误:.value对应的是要保留为新列名的捕获组,这里我们需要把属性名(LastName、Money)作为新列,所以.value要放在第二个位置,对应正则的第二个捕获组。
通用性说明
该写法天然支持多组配对列的场景,只要所有配对列严格遵循{分组标识}_{属性名}的命名规则,不管是10组还是更多配对列,都不需要调整转换逻辑,自动适配所有列完成转换。
内容的提问来源于stack exchange,提问作者Amin Shn
相关产品推荐
相关产品推荐

