假设两个数据集由公共列链接,让他们称呼他们"收件人"和#34;捐助者"。可以使用merge
(R)或LEFT OUTER JOIN
(SQL)组合数据集。
通常,在我的应用程序中,每个收件人记录应该有一个(且恰好一个)匹配的捐赠者记录。如果违反此规定,结果中将显示缺失值或重复的收件人记录。
此合并/加入操作是否有一个特殊名称来强制执行此附加存在+唯一性约束?如果违反了这个约束,我希望合并/连接操作失败,因为在这种情况下,数据或生成数据的某些早期代码有些错误。
enrich <- function(x, y, ...) {
xd <- deparse(substitute(x))
yd <- deparse(substitute(y))
stopifnot(!("..watchdog.." %in% colnames(y)))
y$..watchdog.. <- TRUE
res <- merge(x, y, sort = FALSE, all.x = TRUE, ...)
if (any(is.na(res$..watchdog..)))
stop("At least one row in x=", xd, " has no corresponding row in y=", yd)
if (nrow(res) > nrow(x))
stop("At least one row in x=", xd, " has duplicate corresponding rows in y=", yd)
res$..watchdog.. <- NULL
res
}
rec <- data.frame(id=letters[1:3], a=1)
don <- data.frame(id=letters[1:3], b=2)
enrich(rec, don)
## id a b
## 1 a 1 2
## 2 b 1 2
## 3 c 1 2
enrich(rec, don[1:2,])
## Error in enrich(rec, don[1:2, ]): At least one row in x=rec has no corresponding row in y=don[1:2, ]
enrich(rec, rbind(don, don))
## Error in enrich(rec, rbind(don, don)): At least one row in x=rec has duplicate corresponding rows in y=rbind(don, don)