比较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))