比较R中data.frames的元素

时间:2015-10-06 15:27:27

标签: r dataframe

我有2个数据框

> a1
v1  v2  v3
ABCA1   --> GIF
ACTA1   --| CSNK2A1
ACTN4   --| HDAC7
ACTN4   --> RARA

> a2
v1  v2  v3
ACTA1   --| CSNK2A1
ABCD2   --| HDAC7
ABCA1   --| GIF
ACTN4   --> XYZ1      

我希望输出a1$element1 == a2$element1& a1$element3 == a2$element3& a1$element2 != a2$element2。所以,结果将是:

> a3
ABCA1   --> GIF

因为此行中的所有元素都满足我们所有的3个条件。它是a1中的第1行和a2中的第3行。如您所见(a1的第1行和a2的第3行)ABCA1 == ABCA1& --> != --|& GIF == GIF

2 个答案:

答案 0 :(得分:3)

您可以尝试merge

m2 <- merge(a1, a2, by=c("v1", "v3"))
m2[m2[,3] != m2[,4],][c(1,3,2)]
#     v1 v2.x  v3
#1 ABCA1  --> GIF

我们首先合并第1列和第3列。这将连接前两个条件的情况。对于最后一个条件,测试列符号不同的情况。

创建数据帧时,stringsAsFactors也应设置为FALSE。

使用data.table,您可以使用其浅复制效率进行合并。

setDT(a1)[a2, on = c("v1", "v3")][v2 != i.v2]
      v1  v2  v3 i.v2
1: ABCA1 --> GIF  --|

答案 1 :(得分:2)

这似乎对我有用:

a1[ intersect(which((paste0(a1$v1, a1$v3) %in% paste0(a2$v1, a2$v3))),
              which(a1$v2 != a2$v2)) ,]

#     v1  v2  v3
#1 ABCA1 --> GIF

首先,找到a1和a2中的哪些行具有公共列1和3.然后查找哪些行没有共同的第二列。然后得到两者的交叉,并将其用于子集a1

数据:

a1 <- read.table(header=T,text='v1  v2  v3
ABCA1   --> GIF
ACTA1   --| CSNK2A1
ACTN4   --| HDAC7
ACTN4   --> RARA', stringsAsFactors=F)

a2 <- read.table(header=T,text='v1  v2  v3
ACTA1   --| CSNK2A1
ABCD2   --| HDAC7
ABCA1   --| GIF
ACTN4   --> XYZ1', stringsAsFactors=F)