比较两个数据帧R之间的列

时间:2016-10-10 04:00:43

标签: r dataframe

我有两个数据框:

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的新手,我试着看看比较功能,但有点不知所措。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

感谢可重复的例子。 首先,您可以与merge合并。有关其他配置选项,请查看?merge - 您可以使用by.xby.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

请注意,此处忽略df1df2中不匹配的行。 然后你可以过滤出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, ]