左连接具有唯一性和存在约束

时间:2015-01-14 09:55:20

标签: r join merge nomenclature

假设两个数据集由公共列链接,让他们称呼他们"收件人"和#34;捐助者"。可以使用merge(R)或LEFT OUTER JOIN(SQL)组合数据集。 通常,在我的应用程序中,每个收件人记录应该有一个(且恰好一个)匹配的捐赠者记录。如果违反此规定,结果中将显示缺失值或重复的收件人记录。

问题

此合并/加入操作是否有一个特殊名称来强制执行此附加存在+唯一性约束?如果违反了这个约束,我希望合并/连接操作失败,因为在这种情况下,数据或生成数据的某些早期代码有些错误。

R函数草图

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
}

R函数的结果

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)

0 个答案:

没有答案