merge
ルックアップ テーブルで主キー制約が適用されていない場合、またはall.x = T
.
トラブルに巻き込まれないようにして安全に検索するために、2 つの戦略を提案します。
最初の 1 つは、ルックアップ キーで多数の重複行をチェックすることです。
safeLookup <- function(data, lookup, by, select = setdiff(colnames(lookup), by)) {
# Merges data to lookup making sure that the number of rows does not change.
stopifnot(sum(duplicated(lookup[, by])) == 0)
res <- merge(data, lookup[, c(by, select)], by = by, all.x = T)
return (res)
}
これにより、ルックアップ データセットを使用する前に重複排除が強制されます。
baseSafe <- safeLookup(largetable, house.ids, by = "HouseType")
# Error: sum(duplicated(lookup[, by])) == 0 is not TRUE
baseSafe<- safeLookup(largetable, unique(house.ids), by = "HouseType")
head(baseSafe)
# HouseType HouseTypeNo
# 1 Apartment 4
# 2 Apartment 4
# ...
2 番目のオプションは、ルックアップ データセットから最初に一致する値を取得して、Excel の動作を再現することです。
firstLookup <- function(data, lookup, by, select = setdiff(colnames(lookup), by)) {
# Merges data to lookup using first row per unique combination in by.
unique.lookup <- lookup[!duplicated(lookup[, by]), ]
res <- merge(data, unique.lookup[, c(by, select)], by = by, all.x = T)
return (res)
}
baseFirst <- firstLookup(largetable, house.ids, by = "HouseType")
lookup
これらの関数は、複数の列を追加するため、 とは少し異なります。