如何在R中按pre-post配对规则将数据框重塑为目标格式?
数据框重组解决方案
需求说明
需将DATA数据框转换为指定的Desired_output格式,核心规则:
- 按
study分组,将每组中的pre时间点数据与每个postNUMBER时间点数据配对合并 - 拆分
t(处理组)和c(对照组),分别提取两组的样本量、均值、标准差信息 - 仅保留同时包含
pre和postNUMBER的study,单独只有其中一类时间点的研究直接排除
示例数据
原输入数据:
DATA <- read.table(header=T, text=" study time nt nc mt mc sdt sdc outcome 1 pre 28 58 0.89 1.22 1.40 1.76 Conv 1 post1 28 58 5.07 3.52 3.20 2.58 Conv 1 post2 28 58 3.64 2.86 3.15 2.80 Conv 2 pre 38 48 1.89 2.22 0.40 0.76 fram 2 post1 38 48 4.07 2.52 2.20 1.58 fram 3 post1 31 18 2.07 1.52 1.20 0.58 voca 3 post2 32 18 3.07 2.32 1.12 9.85 voca ")
期望输出:
Desired_output <- read.table(header=T, text=" study time group n mpre mpost sdpre sdpost outcome 1 pre-post1 t 28 0.89 5.07 1.40 3.20 Conv 1 pre-post2 t 28 0.89 3.64 1.40 3.15 Conv 1 pre-post1 c 58 1.22 3.52 1.76 2.58 Conv 1 pre-post2 c 58 1.22 2.86 1.76 2.80 Conv 2 pre-post1 t 38 1.89 4.07 0.40 2.20 fram 2 pre-post1 c 48 2.22 2.52 0.76 1.58 fram ")
实现代码(基于tidyverse)
library(tidyverse) # 分离pre和post数据 pre_data <- DATA %>% filter(time == "pre") post_data <- DATA %>% filter(str_detect(time, "post")) # 筛选仅保留同时有pre和post的研究 valid_studies <- intersect(pre_data$study, post_data$study) pre_data <- pre_data %>% filter(study %in% valid_studies) post_data <- post_data %>% filter(study %in% valid_studies) # 合并pre与post数据,拆分t/c组并整理格式 result <- pre_data %>% inner_join(post_data, by = c("study", "outcome")) %>% mutate(time = paste0(time.x, "-", time.y)) %>% # 提取t组数据并整理 select(study, time, outcome, n_t = nt.x, mpre_t = mt.x, mpost_t = mt.y, sdpre_t = sdt.x, sdpost_t = sdt.y) %>% pivot_longer(cols = starts_with(c("n_", "mpre_", "mpost_", "sdpre_", "sdpost_")), names_to = c(".value", "group"), names_sep = "_") %>% # 提取c组数据并合并 bind_rows( pre_data %>% inner_join(post_data, by = c("study", "outcome")) %>% mutate(time = paste0(time.x, "-", time.y)) %>% select(study, time, outcome, n_c = nc.x, mpre_c = mc.x, mpost_c = mc.y, sdpre_c = sdc.x, sdpost_c = sdc.y) %>% pivot_longer(cols = starts_with(c("n_", "mpre_", "mpost_", "sdpre_", "sdpost_")), names_to = c(".value", "group"), names_sep = "_") ) %>% select(study, time, group, n, mpre, mpost, sdpre, sdpost, outcome) %>% arrange(study, group, time) # 查看最终结果 print(result)
代码说明
- 先拆分
pre和post数据集,通过交集筛选出同时包含两类时间点的有效研究 - 用
inner_join将每个pre数据与同研究、同结局的所有post数据配对 - 分别提取
t组和c组的样本量、均值、标准差,通过pivot_longer将组别信息转换为长格式 - 合并两组数据后按
study、group、time排序,得到目标格式
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

