r - 有没有一种比较两个数据帧的有效方法

标签 r

我有两个行数不同但列数相同的数据框。在下面的示例中,数据帧 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

如果像您所说的那样,您的数据没有数值向量,那么我想我可以建议一种更快的方法。它包括:

  1. 将你的两个 data.frames 变成两个整数矩阵
  2. 计算两个数据行之间的欧氏距离

使用您的数据的快速示例:

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

一些评论:

  1. 如果您的数据包含字符向量,您必须将它们转换为因子并确保它们具有相同的因子水平。
  2. 我使用fields 包来计算欧氏距离。它使用 Fortran 实现,据我所知,这是完成该任务最快的 R 包(我已经测试了很多,相信我。)

关于r - 有没有一种比较两个数据帧的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14485040/

相关文章:

r - Knitr:opts_chunk $ set()在Rscript命令中不起作用

r - glmer : Error in eval(expr, envir, enclos) 中的错误:找不到有效的起始 > 值:请指定一些

r - 使用 roxygen 文档包含图像

r - 如何从数字对象中提取数字

r - 在年之前添加月份

r - 使用 dplyr 和 lazyeval 与 '...'

r - 为什么不将assign() 值分配给R 中的列表元素?

r - 添加阴影效果ggplot2条形图(barplot)

r - 当仅需要 3.4 版时,安装了 3.6.0 版的 R 库时出错

r - Knitr PDF 可以,但没有内容和错误消息