如何重命名带编号变量并通过pivot_longer实现长格式转换?
解决变量后缀导致pivot_longer转换失败的问题
方法1:先重命名变量统一结构
先通过正则表达式把带___N后缀的变量和普通格式的变量统一命名规则,再进行长格式转换:
- 构造示例数据(模拟你的数据集)
library(tidyverse) df1 <- tibble( id = 1:5, dem_lb1 = rnorm(5), dem_ds1 = rnorm(5), dem_tw1___1 = rnorm(5), dem_tw2___1 = rnorm(5), dem_lb2 = rnorm(5), dem_ds2 = rnorm(5), dem_tw1___2 = rnorm(5), dem_tw2___2 = rnorm(5), dem_lb3 = rnorm(5), dem_ds3 = rnorm(5), dem_tw1___3 = rnorm(5), dem_tw2___3 = rnorm(5) )
- 重命名变量,统一为
dem_<变量名>_<分组号>格式
df1_clean <- df1 %>% rename_with( .fn = ~ str_replace(., "(dem_)(lb|ds|tw1|tw2)(___)?(\\d)$", "\\1\\2_\\4"), .cols = starts_with("dem_") )
- 正则说明:捕获前缀
dem_、变量类型(lb/ds/tw1/tw2)、可选的___、末尾的分组号,将其重组为统一的下划线分隔格式。
- 转换为长格式
df_long <- df1_clean %>% pivot_longer( cols = starts_with("dem_"), names_to = c(".value", "group"), names_pattern = "dem_(.*)_(\\d)" )
.value表示保留变量名的前缀部分作为新列名,group提取分组号作为新列。
方法2:直接在pivot_longer中适配两种变量格式
无需提前重命名,直接用正则表达式匹配两种变量格式:
df_long <- df1 %>% pivot_longer( cols = starts_with("dem_"), names_to = c(".value", "group"), names_pattern = "dem_(lb|ds|tw1|tw2)(?:___)?(\\d)" )
- 正则中的
(?:___)?是非捕获组,用于匹配可选的___后缀,同时不将其作为命名组的一部分,直接提取变量类型和分组号。
两种方法最终都会得到每个参与者对应每个分组的lb、ds、tw1、tw2四个变量的长格式数据集。
内容的提问来源于stack exchange,提问作者brainupgraded
相关产品推荐
相关产品推荐

