如何在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的行,填充逻辑如下:
- 针对set2的每一列,若该列任意一行的值与同行的
S列值匹配,则result行对应位置填入"S"; - 对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)
代码说明
- 用
grep筛选出所有以Sa开头的列,确定set2范围; - 初始化与数据框列数一致的空向量
result,用于存储结果; - 遍历set2列,检查是否存在行与同行
S列值相等,满足则标记为"S"; - 对未标记的列,依次检查与
R1、R2列的匹配情况,完成标记; - 将
result转为行添加到原数据框,指定该行ID为"result"。
内容的提问来源于stack exchange,提问作者user3354212
相关产品推荐
相关产品推荐

