【问题标题】:Compare columns between two data frames R比较两个数据框 R 之间的列
【发布时间】:2016-10-10 04:00:43
【问题描述】:

我有两个数据框:

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 很陌生,我试图查看比较功能,但有点不知所措。非常感谢任何帮助。

【问题讨论】:

  • 你能提供你期望从你给出的输入中得到的输出吗?您可以编辑您的问题并将信息放在那里。
  • @mathematical.coffee - 已编辑问题,希望现在更有意义

标签: r dataframe


【解决方案1】:

感谢您提供可重现的示例。 首先,您可以与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, ]

【讨论】:

  • 非常感谢。你有可以推荐给初学者的 R 源吗?我很想学习 R 以精通它。
猜你喜欢
  • 2018-01-26
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多