R语言:对比数据框中两组列对并返回不匹配行的id值
解决方案:对比ref/alt与ref1/alt1列对并返回不匹配的ID
我来帮你搞定这个问题~首先得明确“列对匹配”的两种常见情况,对应不同的实现方式,你可以根据自己的需求选择:
情况1:要求顺序严格匹配
也就是必须ref和ref1相等,同时alt和alt1相等才算匹配。我们可以直接用逻辑筛选提取不匹配行的id:
# 提取顺序不匹配的行的id df$id[!(df$ref == df$ref1 & df$alt == df$alt1)]
运行这段代码会得到:
[1] "2" "3"
原因很直观:行2的(G,C)和(C,G)顺序不一样,行3的(C,G)和(T,A)完全不搭,所以这两行被筛选出来。
情况2:不考虑顺序,只要元素相同就算匹配
如果你觉得(G,C)和(C,G)这种互为反向的列对也算匹配,那我们可以通过判断两个列对的元素集合是否一致来实现。这里有两种写法:
写法1:自定义辅助函数(可读性更高)
# 定义函数:判断两个碱基对是否是同一组(不管顺序) is_same_pair <- function(r, a, r1, a1) { sort(c(r, a)) == sort(c(r1, a1)) } # 批量应用函数,提取不匹配的id df$id[!mapply(is_same_pair, df$ref, df$alt, df$ref1, df$alt1)]
写法2:直接用逻辑判断(更简洁)
不想写函数的话,直接用逻辑或把两种匹配情况列出来就行:
df$id[!( (df$ref == df$ref1 & df$alt == df$alt1) | (df$ref == df$alt1 & df$alt == df$ref1) )]
这两种写法的运行结果都是:
[1] "3"
因为只有行3的(C,G)和(T,A)元素完全不同,其他行要么顺序完全一致,要么是反向的同一碱基对,都被视为匹配。
内容的提问来源于stack exchange,提问作者Iriel
相关产品推荐
相关产品推荐

