背景/基础问题:
我从生产数据库中获取数据提取作业,该数据生成数据集用作进一步分析工作的参考。在数据集的每个构建之间 我希望能够检测数据集中是否有任何变化。数据集存储为数据帧列表。
问题:
以下代码是我的数据集
的简化版本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>>
响应是由人而不是机器读取的,因此对响应没有严格的正式要求。
需要考虑的其他事项:
编辑: 数据框比较可以通过
完成但是,循环遍历data.frames列表的最佳方式是什么
答案 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()
函数。