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

在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

代码说明

  1. 筛选有效研究:先通过分组统计,排除仅含pre或仅含post数据的study,只保留符合配对条件的样本。
  2. 宽表转长表:将原数据中T/C组的n、m、sd指标拆分,生成独立的group列,方便后续同组数据配对。
  3. 配对数据:以study、year、group为连接键,将pre数据和post数据精准配对,避免跨组或跨研究的错误匹配。
  4. 格式整理:将time列调整为pre-postN的格式,同时调整列名和顺序,完全匹配目标输出结构。
  5. 排序优化:按study和group排序,让结果更规整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:50:09