如何使用R语言pivot longer函数将给定数据集整理为指定2×2表
基于pivot_longer的指定格式转换实现
前置依赖
- 核心使用
tidyr包提供的pivot_longer函数,可通过install.packages("tidyr")完成安装,调用时通过library(tidyr)加载即可。 - 整个转换的核心前提:当前的原始宽表4个列名是双维度信息拼接的结构——每个列名同时包含「统计分组(total first / total second)」和「RS状态(yes RS / no rs)」两个独立维度的信息,且存在连字符前后空格不统一、大小写混写的格式不规范问题。
完整可运行代码
# 构造题目给定的原始宽表数据 original_wide_df <- tibble::tibble( `total first - yes RS` = 76L, `total first - no RS` = 20L, `total second- yes rs` = 12L, `total second - no rs` = 0L ) # 格式转换全流程 result_df <- original_wide_df |> # 第一步:用pivot_longer拆分所有宽列 tidyr::pivot_longer( cols = everything(), # 选中全表所有列参与转换 # 用正则表达式匹配列名规则,自动兼容连字符空格不统一、大小写混写的列名 names_pattern = "total\\s+(\\w+)\\s*-\\s+(yes|no)\\s+[Rr][Ss]", # 定义拆分出的两个维度的列名 names_to = c("stat_group", "rs_status"), values_to = "value" ) |> # 第二步:把统计分组维度展成列,得到最终的2×2交叉结构 tidyr::pivot_wider( names_from = stat_group, values_from = value, # 重命名列,匹配目标展示的列名格式 names_prefix = "total " ) |> # 调整行顺序,匹配目标的行排布要求 dplyr::mutate( rs_status = factor(rs_status, levels = c("yes", "no")), rs_status = paste0(stringr::str_to_title(rs_status), " rs") ) |> dplyr::arrange(rs_status)
转换结果说明
执行上述代码后得到的输出和题目要求的结构完全一致:
| rs_status | total first | total second |
|---|---|---|
| Yes rs | 76 | 12 |
| No rs | 20 | 0 |
常见踩坑提示
- 不要直接用
names_sep = "-"做固定分隔符拆分:因为原始列名存在连字符前后空格不统一的问题(比如total second- yes rs连字符前没有空格),硬用固定分隔符会拆分出带多余空格的字段,导致后续维度匹配错位。 - 单次
pivot_longer无法直接得到目标的2×2交叉表:因为单次转换的输出是长表结构,需要搭配一次pivot_wider把其中一个维度展开为列,才能得到行是RS状态、列是统计分组的目标排布。
内容的提问来源于stack exchange,提问作者user35131
相关产品推荐
相关产品推荐

