我有两个数据框:
c1 <- c("chr1:981994","chr1:1025751","chr2:6614300", "chr2:6784300")
c2 <- c("G/A","C/T","A/T", "T/G")
df1 <- data.frame(c1,c2)
a <- c("chr1:981994","chr1:1000000","chr2:6614300", "chr2:6784300")
b <- c("G/G","C/C","A/A", "T/T")
c <- c("G/G","C/C","A/T", "T/T")
d <- c("G/A","C/T","A/T", "T/G")
df2 <- data.frame(a, b, c, d)
我想比较两个数据框,如果第 1 列中的数据匹配,则将 b、c 和 d 列与 c2 列进行比较,如果数据框 2 中至少有两列或更多列(a、b、c 和/或 d) 与数据帧 1 中的 c2 不同,然后将此行输出到新的数据帧中。因此对于此示例,数据帧 2 的第一行和最后一行将被输出,因为列 1 条目匹配且列 b 和 c 与 c2 不同。
我是 R 的新手,我试图查看比较函数,但有点不知所措。非常感谢任何帮助。
最佳答案
感谢您提供可重现的示例。
首先,您可以与 merge
合并.看看?merge
对于其他配置选项 - 您可以使用 by.x
指定要合并的列和 by.y
df3 = merge(df1, df2, by.x='c1', by.y='a')
# c1 c2 b c d
# 1 chr1:981994 G/A G/G G/G G/A
# 2 chr2:6614300 A/T A/A A/T A/T
# 3 chr2:6784300 T/G T/T T/T T/G
请注意 df1
中的非匹配行和 df2
被遗漏在这里。
然后你可以过滤掉 c2
所在的行与 b、c、d 列中的一列完全匹配(然后根据定义它将不匹配其他两列)。
有很多方法可以做到这一点,例如
as.character(df3$c2) == df3[, c('b', 'c', 'd')]
# b c d
# [1,] FALSE FALSE TRUE
# [2,] FALSE TRUE TRUE
# [3,] FALSE FALSE TRUE
只有一个 TRUE 的行是您想要的行。
df3[rowSums(as.character(df3$c2) == df3[, c('b', 'c', 'd')]) == 1, ]
或者您可以简单地遍历所有行,或者使用类似 apply
的东西:
apply(df3, 1, function (row) {
sum(row['c2'] == row[c('b', 'c', 'd')]) == 1
})
# [1] TRUE FALSE TRUE
df3[.Last.value, ]
关于r - 比较两个数据框 R 之间的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39951130/