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

如何在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)

代码说明

  1. 先拆分pre和post数据集,通过交集筛选出同时包含两类时间点的有效研究
  2. 用inner_join将每个pre数据与同研究、同结局的所有post数据配对
  3. 分别提取t组和c组的样本量、均值、标准差,通过pivot_longer将组别信息转换为长格式
  4. 合并两组数据后按study、group、time排序,得到目标格式

内容的提问来源于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.24 11:58:15