繁体   English   中英

检测两个data.frames列表之间的差异

[英]Detect differences between two lists of data.frames

背景/基本问题:

我有一个来自生产数据库的数据提取作业,该数据提取作业生成一个数据集,用作进一步分析工作的参考。 在每个数据集构建之间,我希望能够检测数据集中是否发生了任何更改。 数据集存储为数据框列表。

题:

以下代码是我的数据集的简化版本

account_1 <- data.frame(id = c(1,2), name=c("Andy", "Ben"))
account_2 <- data.frame(id = c(1,2,3), name=c("Andy", "Ben2","Ceasar"))
bill <- data.frame(id=c(101,102,103), account_id = c(1,2,3), amount=c(100,100,100))

db_1 = list(account=account_1, bill=bill)
db_2 = list(account=account_2, bill=bill)

我希望能够检测到帐户数据框中的db_1和db_2之间的差异。 伪代码:

delta(db_1, db_2)

应该回来

account
id name
2 Ben2
3 Ceasar

bill
<<NULL>>

响应是由人而不是机器读取的,因此对响应没有严格的正式要求。

其他要考虑的项目:

  • 相对较小的数据集,无需担心内存/速度
  • 我喜欢tidyverse代码
  • 如果我们可以对新记录(Ceasar)和已修改(Ben)进行git风格的注释,那就太好了

编辑:数据框比较可以通过

但是循环遍历数据列表的最佳方法是什么

基本函数mapply()可以让您遍历多个对象(列表或向量):

mapply(function(x, y) dplyr::anti_join(x, y),
       db_2, db_1) # order matters for the result, since it returns rows in x that don't have a match in y

$account
  id   name
1  2   Ben2
2  3 Ceasar

$bill
[1] id         account_id amount    
<0 rows> (or 0-length row.names)

如果要使用tidyverse函数,请使用purrr::map2()

purrr::map2(db_2, db_1,  ~ anti_join(.x, .y))

如果要比较两个以上的列表,则还有pmap()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM