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

使用pivot_longer和names_pattern时如何为.value匹配结果添加指定前缀

我想使用{tidyr}包中的pivot_longer()结合names_pattern参数将数据转换为长格式,同时保留列名中某一模式匹配项的前缀字符串。这一需求看起来不符合常规操作逻辑,但我需要在应用数据字典清洗步骤前先完成长格式转换,而清洗流程需要用到原始列名。

环境准备

library(dplyr)
library(tidyr)

d <- tibble(id = 1,
            other_var = "foo",
            suffix_t1_value1 = "a",
            suffix_t1_value2 = "b",
            suffix_t2_value1 = "c",
            suffix_t2_value2 = "d") 

已完成操作

现有写法可以实现基础的长格式转换,但生成的数值列名不带前缀:

pivot_longer(d,
             starts_with("suffix"),
             names_pattern = "suffix_t(1|2)_(.*)",
             names_to = c("rep", ".value"))

输出结果:

# A tibble: 2 x 5
     id other_var rep   value1 value2
  <dbl> <chr>     <chr> <chr>  <chr> 
1     1 foo       1     a      b     
2     1 foo       2     c      d    

期望输出

需要数值列保留suffix_t1_前缀:

# A tibble: 2 x 5
     id other_var rep   suffix_t1_value1 suffix_t1_value2
  <dbl> <chr>     <chr> <chr>            <chr>           
1     1 foo       1     a                b               
2     1 foo       2     c                d               

已尝试的方案

尝试1

直接在names_to里拼接前缀模板,不生效:

pivot_longer(d,
             starts_with("suffix"),
             names_pattern = "suffix_t(1|2)_(.*)",
             names_to = c("rep", "suffix_t1_{.value}"))

尝试2

用paste0拼接列名,同样不生效:

pivot_longer(d,
             starts_with("suffix"),
             names_pattern = "suffix_t(1|2)_(.*)",
             names_to = c("rep", paste0("suffix_t1_", ".value")))

解决方案

使用pivot_longer的names_glue参数自定义生成的列名,该参数支持glue语法,可以直接引用.value占位符拼接前缀:

pivot_longer(d,
             starts_with("suffix"),
             names_pattern = "suffix_t(1|2)_(.*)",
             names_to = c("rep", ".value"),
             names_glue = "suffix_t1_{.value}")

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 11:06:04