You need to enable JavaScript to run this app. 如何使用R语言pivot longer函数将给定数据集整理为指定2×2表
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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_statustotal firsttotal second
Yes rs7612
No rs200

常见踩坑提示

  • 不要直接用names_sep = "-"做固定分隔符拆分:因为原始列名存在连字符前后空格不统一的问题(比如total second- yes rs连字符前没有空格),硬用固定分隔符会拆分出带多余空格的字段,导致后续维度匹配错位。
  • 单次pivot_longer无法直接得到目标的2×2交叉表:因为单次转换的输出是长表结构,需要搭配一次pivot_wider把其中一个维度展开为列,才能得到行是RS状态、列是统计分组的目标排布。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 10:24:04