我有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
答案 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)