如何用dplyr将四列按分组标签转置为两列
使用pivot_longer实现分组转置
先构造一个示例数据集方便演示:
library(tibble) library(tidyr) df <- tibble( x1 = c(1, 2, 3), x2 = c(4, 5, 6), y1 = c(7, 8, 9), y2 = c(10, 11, 12), z = c("a", "b", "c") )
直接用pivot_longer结合正则匹配就能完成分组和标签列创建,核心代码如下:
df_long <- df %>% pivot_longer( cols = -z, # 保留z列不参与转置 names_to = c(".value", "group"), # .value对应x/y列的数值,group存分组后缀 names_pattern = "(x|y)(\\d)" # 拆分列名:前半部分是x/y,后半部分是数字1/2 ) %>% mutate(group = paste0("Group ", group)) # 把数字转为指定的分组名称
运行后得到的结果:
df_long #> # A tibble: 6 × 4 #> z group x y #> <chr> <chr> <dbl> <dbl> #> 1 a Group 1 1 7 #> 2 a Group 2 4 10 #> 3 b Group 1 2 8 #> 4 b Group 2 5 11 #> 5 c Group 1 3 9 #> 6 c Group 2 6 12
关键参数说明
cols = -z:明确排除z列,只处理x1、x2、y1、y2这四列names_to = c(".value", "group"):.value是特殊参数,用来指定提取列名中作为新列名的部分;group则用来存储分组标识的后缀数字names_pattern = "(x|y)(\\d)":正则表达式的两个捕获组,分别匹配列名里的x/y前缀和1/2后缀,刚好对应names_to里的两个位置- 最后用
mutate把数字后缀转换成要求的"Group 1"、"Group 2"格式
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

