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就是你想要的结构:
| Sex | Control | prop | SE |
|---|---|---|---|
| Male | Controlled | a | e |
| Woman | Controlled | b | f |
| Male | Uncontrolled | c | g |
| Woman | Uncontrolled | d | h |
内容的提问来源于stack exchange,提问作者Daniel Ramírez
相关产品推荐
相关产品推荐

