检查所有具有相同名称的列在R中是否相等?

时间:2015-03-16 08:58:57

标签: r

假设我有两个数据帧:

DF1

row.names c1 c3 c6 c8 c9
r1 0 3 4 1 1
r2 1 4 5 7 3
r3 0 1 3 4 6

df2

row.names c1 c4 c6 c8 c9
r1 0 2 4 1 1
r2 1 5 5 7 3
r3 0 0 3 4 7

我想检查两个数据帧中具有相同名称的列是否相等(因为它们的所有值完全相同)?

在这种情况下,将检查c1,c6,c8和c9,因为两个数据框都具有这些列名 但是只有c1,c6,c8对于所有相等的值都是真的,而c9将是假的(df1中的6在df2中变为7)?

如果以某种方式它可以指示具有相同列名的所有列是否相等,那将是一个很好的奖励。因此,不是每列都有一个真的,总体上是真的吗?

我对R不太熟悉,所以不确定这个问题是怎么做的..任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:4)

您可以使用mapply()。首先,我们使用intersect()查找匹配的列名称,然后在每列上运行identical()

i <- intersect(names(df1), names(df2))
mapply(identical, df1[i], df2[i])
#   c1    c6    c8    c9 
# TRUE  TRUE  TRUE FALSE 

其中

df1 <- read.table(text = "c1 c3 c6 c8 c9
 r1 0 3 4 1 1
 r2 1 4 5 7 3
 r3 0 1 3 4 6", header = TRUE)
df2 <- read.table(text = "c1 c4 c6 c8 c9
 r1 0 2 4 1 1
 r2 1 5 5 7 3
 r3 0 0 3 4 7", header = TRUE)

答案 1 :(得分:4)

另一种选择是all.equal:

i <- intersect(names(df1), names(df2))
all.equal(df1[i], df2[i])
[1] "Component “c9”: Mean relative difference: 0.1666667"

因此,在这种情况下,并非列c9中的所有值都相同。