我有两个行数不同但列数相同的数据框。在下面的示例中,数据帧 1 是 4 x 2,数据帧 2 是 3 x 2。我需要一个 4 x 3 逻辑矩阵,其中 TRUE 表示数据帧中的所有行都匹配。这个例子有效,但需要很长时间才能运行更大的数据帧(我正在尝试两个数据帧,大约有 5,000 行,但仍然只有两列)。有更有效的方法吗?
> df1 <- data.frame(row.names=1:4, var1=c(TRUE, TRUE, FALSE, FALSE), var2=c(1,2,3,4))
> df2 <- data.frame(row.names=5:7, var1=c(FALSE, TRUE, FALSE), var2=c(5,2,3))
>
> m1 <- t(as.matrix(df1))
> m2 <- as.matrix(df2)
>
> apply(m2, 1, FUN=function(x) { apply(m1, 2, FUN=function(y) { all(x==y) } ) })
5 6 7
1 FALSE FALSE FALSE
2 FALSE TRUE FALSE
3 FALSE FALSE TRUE
4 FALSE FALSE FALSE
在此先感谢您的帮助。
最佳答案
我是被你在 R-bloggers 上的帖子吸引到这里的:http://jason.bryer.org/posts/2013-01-24/Comparing_Two_Data_Frames.html
如果像您所说的那样,您的数据没有数值向量,那么我想我可以建议一种更快的方法。它包括:
- 将你的两个 data.frames 变成两个整数矩阵
- 计算两个数据行之间的欧氏距离
使用您的数据的快速示例:
mat1 <- as.matrix(sapply(df1, as.integer))
mat2 <- as.matrix(sapply(df2, as.integer))
library(fields)
rdist(mat1, mat2) < 1e-9
# [,1] [,2] [,3]
# [1,] FALSE FALSE FALSE
# [2,] FALSE TRUE FALSE
# [3,] FALSE FALSE TRUE
# [4,] FALSE FALSE FALSE
一些评论:
- 如果您的数据包含字符向量,您必须将它们转换为因子并确保它们具有相同的因子水平。
- 我使用
fields
包来计算欧氏距离。它使用 Fortran 实现,据我所知,这是完成该任务最快的 R 包(我已经测试了很多,相信我。)
关于r - 有没有一种比较两个数据帧的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14485040/