如何为pivot_longer的names_pattern编写正确正则表达式?
解决tidyr::pivot_longer的names_pattern正则问题
针对你的宽表结构,直接用以下方案实现需求:
核心正则表达式
^(.*)_(L\\d+)$
正则逻辑说明
^:锚定列名开头,避免匹配中间的无效片段(.*):捕获最后一个下划线之前的所有内容(比如Read_F_L1里的Read_F、WC_L2里的WC),对应新表的Measure列_:匹配列名里的分隔下划线(L\\d+):捕获最后一个下划线后的分组标识(比如L1、L2),对应新表的GROUP列$:锚定列名结尾,确保匹配完整的列名
完整R代码
library(tidyr) # 你的输入数据 df <- structure(list(ID = structure(c("Person1", "Person2", "Person3", "Person4", "Person5"), class = c("glue", "character")), WC_L1 = c(55, 88, 102, 53, 87), WC_L2 = c(84, 102, 71, 43, 145), Read_F_L1 = c(70, 66, 59, 61, 73), Read_F_L2 = c(73, 140, 59, 70, 107), Read_C_L2 = c(80, 80, 60, 60, 80), APL_L1 = c(34, 51, 67, 33, 56), APL_L2 = c(40, 45, 46, 30, 72)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame")) # 转换为目标长表 long_df <- df %>% pivot_longer( cols = -ID, # 排除ID列,转换其余所有列 names_to = c("Measure", "GROUP"), # 对应正则的两个捕获组 names_pattern = "^(.*)_(L\\d+)$", values_to = "Value" # 存储原列数值的新列名 ) # 查看转换结果 print(long_df)
转换后长表示例
截取前7行结果如下:
# A tibble: 14 × 4 ID Measure GROUP Value <glue> <chr> <chr> <dbl> 1 Person1 WC L1 55 2 Person1 WC L2 84 3 Person1 Read_F L1 70 4 Person1 Read_F L2 73 5 Person1 Read_C L2 80 6 Person1 APL L1 34 7 Person1 APL L2 40 ...
内容的提问来源于stack exchange,提问作者Larissa Cury
相关产品推荐
相关产品推荐

