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

时间:2017-12-23 10:12:41

标签: r dplyr

背景/基础问题:

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

问题:

以下代码是我的数据集

的简化版本
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风格的评论,那就很好了

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

完成

但是,循环遍历data.frames列表的最佳方式是什么

1 个答案:

答案 0 :(得分:2)

基函数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()函数。