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

如何在R语言中对比set1与set2列,按规则生成result行?

R语言:对比数据框列生成result行

原始数据框

df = read.table(text="ID    S   R1  R2  Sa1 Sa2 Sa4 Sa5 Sa6 Sa7 Sa8 Sa9 Sa10    Sa11
    Chr18_1635988   CC  GG  GG  CC  GG  GG  GG  CC  GG  GG  CC  GG  GG
    Chr18_1636023   AA  TT  TT  AA  TT  TT  TT  AA  AT  TT  AA  TT  TT
    Chr18_1639152   TT  CC  CC  TT  CC  CC  CC  CC  CC  CC  TT  CC  TC
    Chr18_1642235   CC  AA  AA  CC  AA  AA  CA  CC  CA  AA  CC  AA  AA
    Chr18_1643643   --  AA  CC  CC  CC  AA  AA  --  CA  CA  CA  CC  CC
    Chr18_1643660   --  CC  GG  CC  GG  CC  CC  CC  CC  CC  CC  GG  GG
    Chr18_1656020   AA  TT  TT  AA  TT  TT  TT  AA  AA  AT  AA  AA  AT
    Chr18_1657597   CC  TT  TT  CC  TT  TT  TT  CC  CC  CT  CC  TT  TT
    Chr18_1657618   GG  TT  TT  GG  TT  TT  TT  GG  GG  GT  GG  TT  TT", header=T, stringsAsFactors=F)

列分组定义

  • set1:第2至4列(S、R1、R2列)
  • set2:列名以Sa开头的所有列

需求规则

在数据框末尾添加一行名为result的行,填充逻辑如下:

  1. 针对set2的每一列,若该列任意一行的值与同行的S列值匹配,则result行对应位置填入"S";
  2. 对set2中未被规则1分配的列,继续匹配:若该列任意一行的值与同行的R1列值匹配则填"R1",与R2列值匹配则填"R2"。

预期结果

final = read.table(text="ID S   R1  R2  Sa1 Sa2 Sa4 Sa5 Sa6 Sa7 Sa8 Sa9 Sa10    Sa11
    Chr18_1635988   CC  GG  GG  CC  GG  GG  GG  CC  GG  GG  CC  GG  GG
    Chr18_1636023   AA  TT  TT  AA  TT  TT  TT  AA  AT  TT  AA  TT  TT
    Chr18_1639152   TT  CC  CC  TT  CC  CC  CC  CC  CC  CC  TT  CC  TC
    Chr18_1642235   CC  AA  AA  CC  AA  AA  CA  CC  CA  AA  CC  AA  AA
    Chr18_1643643   --  AA  CC  CC  CC  AA  AA  --  CA  CA  CA  CC  CC
    Chr18_1643660   --  CC  GG  CC  GG  CC  CC  CC  CC  CC  CC  GG  GG
    Chr18_1656020   AA  TT  TT  AA  TT  TT  TT  AA  AA  AT  AA  AA  AT
    Chr18_1657597   CC  TT  TT  CC  TT  TT  TT  CC  CC  CT  CC  TT  TT
    Chr18_1657618   GG  TT  TT  GG  TT  TT  TT  GG  GG  GT  GG  TT  TT
    result              S   R2  R1  R1  S   S   R1  S   S   R2", header=T, stringsAsFactors=F) 

解决方案代码

# 提取set2列名
set2_cols <- grep("^Sa", colnames(df), value = TRUE)
# 初始化result行
result <- rep("", ncol(df))
names(result) <- colnames(df)

# 规则1:匹配S列
for (col in set2_cols) {
  if (any(df[[col]] == df[["S"]])) {
    result[col] <- "S"
  }
}

# 规则2:匹配R1/R2列(处理未被规则1分配的列)
remaining_cols <- set2_cols[result[set2_cols] == ""]
for (col in remaining_cols) {
  if (any(df[[col]] == df[["R1"]])) {
    result[col] <- "R1"
  } else if (any(df[[col]] == df[["R2"]])) {
    result[col] <- "R2"
  }
}

# 将result行添加到数据框,并设置ID为"result"
final <- rbind(df, result)
final[nrow(final), "ID"] <- "result"

# 查看最终结果
print(final)

代码说明

  1. 用grep筛选出所有以Sa开头的列,确定set2范围;
  2. 初始化与数据框列数一致的空向量result,用于存储结果;
  3. 遍历set2列,检查是否存在行与同行S列值相等,满足则标记为"S";
  4. 对未标记的列,依次检查与R1、R2列的匹配情况,完成标记;
  5. 将result转为行添加到原数据框,指定该行ID为"result"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:08:07