You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:无法用pivot_longer重组数据集,求解决方案

解决方案:宽格式转目标长格式数据

首先构造示例数据方便测试:

library(tidyverse)

# 原数据框
original_df <- tibble(
  Sex = c("Male", "Woman"),
  Controlled = c("a", "b"),
  Uncontrolled = c("c", "d"),
  SE_Controlled = c("e", "f"),
  SE_Uncontrolled = c("g", "h")
)

方法一:拆分合并法(直观易懂)

把两种控制状态的数据分别提取、重命名,再合并到一起:

# 提取Controlled组数据并整理
controlled_part <- original_df %>%
  select(Sex, Controlled, SE_Controlled) %>%
  rename(prop = Controlled, SE = SE_Controlled) %>%
  mutate(Control = "Controlled")

# 提取Uncontrolled组数据并整理
uncontrolled_part <- original_df %>%
  select(Sex, Uncontrolled, SE_Uncontrolled) %>%
  rename(prop = Uncontrolled, SE = SE_Uncontrolled) %>%
  mutate(Control = "Uncontrolled")

# 合并两组数据,调整列顺序
target_df <- bind_rows(controlled_part, uncontrolled_part) %>%
  select(Sex, Control, prop, SE)

方法二:用pivot_longer优雅实现

利用pivot_longer的正则匹配功能,一次性完成格式转换:

target_df <- original_df %>%
  pivot_longer(
    cols = -Sex,  # 排除Sex列,处理其他所有列
    names_to = c(".value", "Control"),  # .value表示保留的指标名,Control是分组列
    names_pattern = "(SE_)?(.*)"  # 正则捕获:第一部分是可选的SE_,第二部分是控制状态
  ) %>%
  # 把捕获到的空值(对应无SE_前缀的列)替换成prop,同时去掉SE_的下划线
  mutate(.value = ifelse(.value == "", "prop", str_remove(.value, "_"))) %>%
  # 转宽格式得到prop和SE列
  pivot_wider(names_from = .value, values_from = value)

运行任意一种方法后,target_df就是你想要的结构:

SexControlpropSE
MaleControlledae
WomanControlledbf
MaleUncontrolledcg
WomanUncontrolleddh

内容的提问来源于stack exchange,提问作者Daniel Ramírez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:52:54