如何重排DataFrame使各测试的pre与post列相邻?
调整随访数据集列顺序:将每个测试的pre/post列相邻排列
模拟原始数据(对应TABLE 1结构)
假设你的数据集列结构如下(以3项测试为例,20项测试逻辑完全一致):
set.seed(123) df <- tibble( ID = 1:5, TestA_pre = rnorm(5), TestB_pre = rnorm(5), TestC_pre = rnorm(5), TestA_post = rnorm(5), TestB_post = rnorm(5), TestC_post = rnorm(5) )
方法1:使用tidyverse工具包(推荐)
通过提取测试名称、构建目标列顺序来重排列:
library(tidyverse) # 提取所有测试名称(去掉_pre/_post后缀) test_names <- unique(str_remove(names(df)[-1], "_pre|_post")) # 生成目标列顺序:ID + 每个测试的pre列→post列 target_cols <- c("ID", unlist(map(test_names, ~c(paste0(.x, "_pre"), paste0(.x, "_post"))))) # 重排列得到TABLE 2结构 df_reordered <- df %>% select(all_of(target_cols))
方法2:Base R实现(无需额外包)
如果不想加载第三方工具包,用基础R代码也能完成:
# 提取测试名称 test_names <- unique(sub("_pre|_post", "", names(df)[-1])) # 构建目标列顺序 target_cols <- c("ID", as.vector(outer(test_names, c("_pre", "_post"), paste0))) # 重排列 df_reordered_base <- df[, target_cols]
核心逻辑说明
两种方法的思路完全一致:
- 从现有列名中提取所有测试的基础名称(如TestA、TestB)
- 按照「测试名_pre → 测试名_post」的固定顺序,生成目标列名向量
- 根据该向量重新排列数据集的列
这种方法完全规避了Excel手动操作的出错风险,且可以无缝适配你提到的20项测试场景。
内容的提问来源于stack exchange,提问作者amir.fathi
相关产品推荐
相关产品推荐

