使用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
相关产品推荐
相关产品推荐

