比较R中的data.frames

比较R中的data.frames,r,dataframe,R,Dataframe,我有两个数据帧 > a1 v1 v2 v3 ABCA1 --> GIF ACTA1 --| CSNK2A1 ACTN4 --| HDAC7 ACTN4 --> RARA > a2 v1 v2 v3 ABCA1 --| GIF ACTA1 --| CSNK2A1 ABCD2 --| HDAC7 ACTN4 --> XYZ1 我想要输出,其中a1$v1==a2$v1&&&&a1$v3==a2$v3&&a1$v2!=a2$v2。

我有两个数据帧

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

> a2
v1  v2  v3
ABCA1   --| GIF
ACTA1   --| CSNK2A1
ABCD2   --| HDAC7
ACTN4   --> XYZ1
我想要输出,其中
a1$v1==a2$v1
&&&&
a1$v3==a2$v3
&&
a1$v2!=a2$v2
。因此,结果将是:

> a3
ABCA1   --> GIF

因为第1行满足所有这些条件。第2行中的
条件3
未满足。第3行
条件1
未满足,第4行
条件2
未满足。

如果我们比较'a1'和'a2'数据集中的'v1'列,并使用
&
而不是
&
,我们会得到预期的输出

a1[(a1$v1==a2$v1) & (a1$v3==a2$v3) & (a1$v2 != a2$v2), , drop=FALSE]
#    v1  v2  v3
#1 ABCA1 --> GIF
根据
?“&&”

“&”和“&&”表示逻辑and,“|”和“||”表示逻辑and 逻辑或。较短的形式在中执行元素级比较 与算术运算符的方式大致相同。较长形式 从左到右求值,只检查每个元素的第一个元素 向量

更新 如果我们需要将“a1”中的一行与所有行进行比较,我们可以使用
do.call(paste,…
,并在“a1”的
paste
元素上循环
lappy
并与
paste
d'a2'中的行进行比较,或者可以使用
outer
进行比较

 lapply(do.call(paste, a1), '==', do.call(paste, a2))

数据
a1@user3253470它根据输入数据集给出了您所显示的预期输出。@user3253470检查列是否有前导/后导空格。在这种情况下,
==
可能返回
FALSE
,即
“-->”==“-->”#[1]FALSE
@user3253470如果有这种情况,
库(stringr);a1[]感谢它完成了,我没有足够的分数来支持答案!有一个小问题。我想比较“any”
a1$v1==a2$v1
&
a1$v3
=
a2$v3
&
a1$v2!=a2$v2
。这段代码正在对每一行(例如
a1
的第1行与
a2
的第1行)进行比较.你能帮我吗?@akrun
 outer(do.call(paste, a1), do.call(paste, a2), '==')
a1 <- structure(list(v1 = c("ABCA1", "ACTA1", "ACTN4", "ACTN4"),
 v2 = c("-->", 
"--|", "--|", "-->"), v3 = c("GIF", "CSNK2A1", "HDAC7", "RARA"
)), .Names = c("v1", "v2", "v3"), class = "data.frame", 
row.names = c(NA, -4L))

a2 <- structure(list(v1 = c("ABCA1", "ACTA1", "ABCD2", "ACTN4"), 
v2 = c("--|", 
"--|", "--|", "-->"), v3 = c("GIF", "CSNK2A1", "HDAC7", "XYZ1"
)), .Names = c("v1", "v2", "v3"), class = "data.frame",
row.names = c(NA, -4L))