假设我有两个数据帧:
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不太熟悉,所以不确定这个问题是怎么做的..任何帮助都将不胜感激!
答案 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中的所有值都相同。