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

如何用循环实现同名称组内Control与Treated样本的匹配比较

按Name匹配Control与Treated组,避免跨名称比较

原始数据与代码

首先定义数据框df和元数据框meta_df:

df <- data.frame(Gene=c("gene1","gene2","gene3"),
                 Co_Mark_A_Treat= c(10,11,12),
                 Co_Mark_B_Treat= c(10,11,12),
                 Co_Mark_C_Treat= c(10,11,12),
                 Co_Mark_Ctr= c(15,16,17),
                 Co_Paul_A_Treat= c(10,11,12),
                 Co_Paul_B_Treat= c(10,11,12),
                 Co_Paul_C_Treat= c(10,11,12),
                 Co_Paul_Ctr= c(15,16,17))


meta_df <- data.frame(Sample=c("Mark_A_Treat","Mark_B_Treat", "Mark_C_Treat", "Mark_Ctr"
                               ,"Paul_A_Treat","Paul_B_Treat","Paul_C_Treat", "Paul_Ctr"),
                      Name=c("Mark","Mark", "Mark", "Mark","Paul","Paul","Paul","Paul"))

row.names(meta_df) <- paste0(c("Co_Mark_A_Treat","Co_Mark_B_Treat", "Co_Mark_C_Treat","Co_Mark_Ctr",
                               "Co_Paul_A_Treat","Co_Paul_B_Treat", "Co_Paul_C_Treat","Co_Paul_Ctr"))

随后的分组与循环代码:

groups <- unique(meta_df$Sample)
  
groups_treat <- groups[grep("Treat",groups)]

groups_ctr <- groups[grep("Ctr",groups)]

for (j in 1:length(groups_treat)) { 
  
  for (i in 1:length(groups_ctr)){
    
    
    group1 <- groups_ctr[i]
    
    cond1 <- rownames(meta_df[grep(group1,meta_df$Sample),])
    
    
    group2 <- groups_treat[j]
    
    cond2 <- rownames(meta_df[grep(group2,meta_df$Sample),])
    
    print(paste("processing ", group1 , " versus ", group2))
    
    }}

当前问题

上述代码会生成所有Control与Treated组的全量组合,包含跨Name的无效比较(如Mark_Ctr与Paul_A_Treat),输出如下:

[1] "processing  Mark_Ctr  versus  Mark_A_Treat"
[1] "processing  Paul_Ctr  versus  Mark_A_Treat"
[1] "processing  Mark_Ctr  versus  Mark_B_Treat"
[1] "processing  Paul_Ctr  versus  Mark_B_Treat"
[1] "processing  Mark_Ctr  versus  Mark_C_Treat"
[1] "processing  Paul_Ctr  versus  Mark_C_Treat"
[1] "processing  Mark_Ctr  versus  Paul_A_Treat"
[1] "processing  Paul_Ctr  versus  Paul_A_Treat"
[1] "processing  Mark_Ctr  versus  Paul_B_Treat"
[1] "processing  Paul_Ctr  versus  Paul_B_Treat"
[1] "processing  Mark_Ctr  versus  Paul_C_Treat"
[1] "processing  Paul_Ctr  versus  Paul_C_Treat"

期望输出

仅保留同Name组内的Control与Treated比较:

[1] "processing  Mark_Ctr  versus  Mark_A_Treat"
[1] "processing  Mark_Ctr  versus  Mark_B_Treat"
[1] "processing  Mark_Ctr  versus  Mark_C_Treat"
[1] "processing  Paul_Ctr  versus  Paul_A_Treat"
[1] "processing  Paul_Ctr  versus  Paul_B_Treat"
[1] "processing  Paul_Ctr  versus  Paul_C_Treat"

解决方案

核心逻辑是按Name分组处理,先提取每个Name对应的Control组和所有Treated组,再在组内完成配对比较,彻底避免跨Name的无效组合:

修改后的代码如下:

# 获取所有唯一的Name
unique_names <- unique(meta_df$Name)

# 遍历每个Name
for (name in unique_names) {
  # 筛选当前Name对应的所有样本
  name_samples <- meta_df[meta_df$Name == name, "Sample"]
  
  # 提取当前Name的Control组
  ctr_group <- name_samples[grep("Ctr", name_samples)]
  
  # 提取当前Name的所有Treated组
  treat_groups <- name_samples[grep("Treat", name_samples)]
  
  # 遍历当前Name的每个Treated组,与Control组配对
  for (treat_group in treat_groups) {
    # 获取对应的行名(如果后续需要调用df中的列)
    cond1 <- rownames(meta_df[meta_df$Sample == ctr_group, ])
    cond2 <- rownames(meta_df[meta_df$Sample == treat_group, ])
    
    print(paste("processing ", ctr_group , " versus ", treat_group))
  }
}

代码说明

  1. 先通过unique(meta_df$Name)获取所有独立名称(Mark、Paul);
  2. 针对每个名称,筛选出该名称下的所有样本,再分离出Control组和Treated组;
  3. 仅在当前名称范围内,将Control组与每个Treated组配对,完全避免跨名称的无效组合。

执行上述代码后即可得到符合预期的输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:53