Utilisation de merge
est différente de la consultation dans Excel, car elle peut potentiellement dupliquer (multiplier) vos données si la contrainte de clé primaire n'est pas appliquée dans la table de consultation ou réduire le nombre d'enregistrements si vous n'utilisez pas de clé primaire. all.x = T
.
Pour être sûr de ne pas avoir d'ennuis avec cela et de faire des recherches en toute sécurité, je vous propose deux stratégies.
La première consiste à vérifier un certain nombre de lignes dupliquées dans la clé de recherche :
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)
}
Cela vous obligera à dé-duper le jeu de données de lookup avant de l'utiliser :
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
# ...
La deuxième option consiste à reproduire le comportement d'Excel en prenant la première valeur correspondante dans l'ensemble de données de consultation :
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")
Ces fonctions sont légèrement différentes de lookup
car ils ajoutent plusieurs colonnes.