比较R中的data.frames

时间:2015-10-05 16:16:10

标签: r dataframe

我有2个数据框

> 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行condition 3未完成。第3行condition 1未得到履行,第4行condition 2未履行。

1 个答案:

答案 0 :(得分:0)

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

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

根据?"&&"

的描述
  

'&'和'&&'表示逻辑AND,'|'和'||'表示        逻辑或。较短的形式执行元素比较        与算术运算符的方式大致相同。更长的形式        从左到右评估只检查每个元素的第一个元素        矢量。

更新

如果我们需要比较' a1'针对所有行,我们可以使用paste do.call(paste,..每个数据集中的行,并在' a1'的lapply元素上循环paste。并与paste d' a2'进行比较或者这可以使用outer完成。

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

或者

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