在R的tidyverse中基于变量后缀实现长表转宽表的方法求助
数据集转换问题解决方法
问题描述
需要将给定的DATA数据集转换为指定的Desired_output格式,具体要求:
- 针对每个唯一的
study,分别将T组和C组的pre与postNUMBER数据配对组合; - 若某个
study仅包含pre数据或仅包含postNUMBER数据,则排除该study(如Jasmi和Zill研究需排除)。
用户尝试了以下tidyverse代码但未成功:
DATA <- read.table(header=TRUE,text=" study year mT sdT nT mC sdC nC time Al_Ajmi 2015 1.68 1.07 25 1.44 1.08 31 pre Al_Ajmi 2015 7.4 2.22 25 1.08 1.12 31 post1 Al_Ajmi 2015 8.08 1.75 25 1.48 1.08 31 post2 Jasmi 2020 1.3 1 30 2 1 30 pre Zill 2019 2 1 41 3 2 32 post1 Zill 2019 3 3 41 1 1 32 post2") Desired_output <- read.table(header=T, text=" study year time group n mpre mpost sdpre sdpost Al_Ajmi 2015 pre-post1 T 25 1.68 7.4 1.07 2.22 Al_Ajmi 2015 pre-post2 T 25 1.68 8.08 1.07 1.75 Al_Ajmi 2015 pre-post1 C 31 1.44 1.08 1.08 1.12 Al_Ajmi 2015 pre-post2 C 31 1.44 1.48 1.08 1.08 ") # I tried the following without success: library(tidyverse) dat8 <- DATA %>% pivot_longer(nT:sdC, names_to = c(".value","group"), names_pattern = "(n|m|sd)(T|C)") output <- left_join(filter(dat8, time !="pre"), filter(dat8, time =="pre"), by = c("study","group"), suffix= c("post","pre") ) %>% select(study:sdpost,npre:sdpre) %>% rename_with(~str_remove(.,"post"), -c("mpost","sdpost")) %>% mutate(time=recode(time, "post1"="pre-post1", "post2"="pre-post2")) %>% arrange(study, group)
修正后的代码
library(tidyverse) # 筛选同时包含pre和post数据的有效study valid_studies <- DATA %>% group_by(study) %>% summarise( has_pre = any(time == "pre"), has_post = any(str_detect(time, "^post")), .groups = "drop" ) %>% filter(has_pre & has_post) %>% pull(study) # 转换为目标格式 output <- DATA %>% filter(study %in% valid_studies) %>% # 宽表转长表,拆分T/C组的指标 pivot_longer( cols = nT:sdC, names_to = c(".value", "group"), names_pattern = "(n|m|sd)(T|C)" ) %>% # 配对pre和post数据 left_join( filter(., time == "pre"), filter(., str_detect(time, "^post")), by = c("study", "year", "group"), suffix = c("_pre", "_post") ) %>% # 整理time列和列顺序 mutate(time = str_c("pre-", time_post)) %>% select( study, year, time, group, n = n_pre, mpre = m_pre, mpost = m_post, sdpre = sd_pre, sdpost = sd_post ) %>% arrange(study, group) # 查看结果 output
代码说明
- 筛选有效研究:先通过分组统计,排除仅含pre或仅含post数据的study,只保留符合配对条件的样本。
- 宽表转长表:将原数据中T/C组的n、m、sd指标拆分,生成独立的
group列,方便后续同组数据配对。 - 配对数据:以
study、year、group为连接键,将pre数据和post数据精准配对,避免跨组或跨研究的错误匹配。 - 格式整理:将
time列调整为pre-postN的格式,同时调整列名和顺序,完全匹配目标输出结构。 - 排序优化:按
study和group排序,让结果更规整。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

