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

R 比较两个数据帧之间的列,r,dataframe,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

我有两个数据帧:

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)

c1感谢您提供了可复制的示例。
首先,您可以使用
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, ]

你能提供你期望从你提供的输入中得到的输出吗?您可以编辑您的问题并将信息放在那里。@mathematic.coffee-您已经编辑了问题,希望它现在更有意义。非常感谢。你有没有可以推荐给初学者的R源代码?我很想学习R,从而变得相当精通它。