我有两个数据框,每个数据框都有两列(例如,x 和 y)。我需要比较两个数据帧并查看 x 或 y 中的任何值或 x 和 y 中的任何值在两个数据帧中是否相似。
问问题
35643 次
2 回答
33
使用all.equal
功能。它不对数据帧进行排序。它会简单地检查每个单元data frame
格与另一个单元格中的相同单元格。你也可以使用identical()
函数。
于 2012-06-11T12:49:14.020 回答
8
没有一个例子,我不能确定我理解你想要什么。但是,我认为你想要这样的东西。如果是这样,几乎可以肯定有更好的方法来做同样的事情。
a <- matrix(c(1,2,
3,4,
5,6,
7,8), nrow=4, byrow=T, dimnames = list(NULL, c("x","y")))
b <- matrix(c(1,2,
9,4,
9,6,
7,9), nrow=4, byrow=T, dimnames = list(NULL, c("x","y")))
cc <- matrix(c(NA,NA,
NA,NA,
NA,NA,
NA,NA), nrow=4, byrow=T, dimnames = list(NULL, c("x","y")))
for(i in 1:dim(a)[1]) {
for(j in 1:dim(a)[2]) {
if(a[i,j]==b[i,j]) cc[i,j]=a[i,j]
}
}
cc
编辑:2013 年 1 月 8 日
以下行将告诉您两个矩阵之间哪些单元格不同:
which(a != b, arr.ind=TRUE)
# row col
# [1,] 2 1
# [2,] 3 1
# [3,] 4 2
如果两个矩阵 a 和 b 相同,则:
which(a != b)
# integer(0)
which(a != b, arr.ind=TRUE)
# row col
编辑 2012 年 1 月 9 日
以下代码演示了行名称对 的影响identical
,all.equal
以及which
何时通过子集第三个数据框创建两个数据框之一。如果正在比较的两个数据帧之间的行名称不同,则既不identical
也不all.equal
返回TRUE
。但是,which
仍然可以用于比较列x
和y
两个数据框之间的情况。NULL
如果为要比较的两个数据帧中的每一个设置行名称,则两者identical
都all.equal
将返回TRUE
.
df1 <- read.table(text = "
group x y
1 10 20
1 10 20
1 10 20
1 10 20
2 1 2
2 3 4
2 5 6
2 7 8
", sep = "", header = TRUE)
df2 <- read.table(text = "
group x y
2 1 2
2 3 4
2 5 6
2 7 8
", sep = "", header = TRUE)
# df3 is a subset of df1
df3 <- df1[df1$group==2,]
# rownames differ between df2 and df3 and
# therefore neither 'all.equal' nor 'identical' return TRUE
# even though the i,j cells of df2 and df3 are the same.
# Note that 'which' indicates no i,j cells differ between df2 and df3
df2
df3
all.equal(df2, df3)
identical(df2, df3)
which(df2 != df3)
# set row names to NULL in both data sets and
# now both 'all.equal' and 'identical' return TRUE.
# Note that 'which' still indicates no i,j cells differ between df2 and df3
rownames(df2) <- NULL
rownames(df3) <- NULL
df2
df3
all.equal(df2, df3)
identical(df2, df3)
which(df2 != df3)
于 2012-06-11T12:07:10.113 回答