如何掌握pivot_longer的names_pattern参数分组功能并实现数据转换
错误原因排查
你的原有代码无法得到预期结果,核心问题出在names_pattern的规则设置:
- 正则匹配范围错误:你写的
[a-z]+仅能匹配纯小写字符,而你的列名均以大写字母开头,完全无法命中捕获规则 - 分组逻辑不符合列名结构:你的列名规则为
<分组标识>_Ideology、<分组标识>_Ideology_se,你需要将第一个下划线前的内容提取为Variable列的取值,后半部分提取为新的列名
修正后可运行代码
library(tidyr) library(dplyr) df %>% pivot_longer( cols = everything(), names_to = c("Variable", ".value"), names_pattern = "^(\\w+)_(Ideology|Ideology_se)$", names_transform = list(.value = ~ sub("Ideology_se", "se", .x)) )
运行后输出结果如下(你示例输出中的0.54、0.005为笔误,实际结果与原始输入数据一致):
# A tibble: 2 × 3 Variable Ideology se <chr> <dbl> <dbl> 1 Weighted 0.514 0 2 Unweighted 0.51 0.004
分组逻辑说明
names_pattern的捕获组数量需要和names_to的长度完全对应,每组捕获的内容按顺序匹配names_to的元素:
- 第一个捕获组
(\\w+)匹配列名第一个下划线前的所有字符,对应names_to的第一个元素Variable,捕获到的Weighted、Unweighted会作为Variable列的取值 - 第二个捕获组匹配列名后半段的指标标识,对应
names_to里的特殊标记.value:捕获到的Ideology、Ideology_se会作为新的列名,names_transform参数负责把Ideology_se替换为你需要的se列名
内容的提问来源于stack exchange,提问作者spindoctor
相关产品推荐
相关产品推荐

