You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:32:17