Ceci est une question R apparemment simple, mais je ne vois pas de réponse exacte ici. J'ai un cadre de données (alldata) qui ressemble à ceci:
Case Zip market
1 44485 0
2 44481 0
3 43210 0
Il y a plus de 3,5 millions de disques.
Ensuite, j'ai un deuxième cadre de données, "codes zip".
market Zip
1 44485
1 44486
1 44488
... ... (100 zips in market 1)
2 43210
2 43211
... ... (100 zips in market 2, etc.)
Je souhaite renvoyer la valeur correcte pour alldata $ market pour chaque cas basé sur alldata $ Zip correspondant à la valeur appropriée dans le bloc de données de code postal. Je cherche simplement la bonne syntaxe et l'assistance est très appréciée, comme d'habitude.
Puisque vous ne vous souciez pas de la colonne market
dans alldata
, vous pouvez d'abord la supprimer en utilisant et fusionner les colonnes dans alldata
et zipcodes
en fonction de la colonne Zip
en utilisant merge
:
merge(alldata[, c("Case", "Zip")], zipcodes, by="Zip")
Le paramètre by
spécifie les critères de clé. Ainsi, si vous avez une clé composée, vous pouvez faire quelque chose comme by=c("Zip", "otherfield")
.
Une autre option qui a fonctionné pour moi et qui est très simple:
alldata$market<-with(zipcodes, market[match(alldata$Zip, Zip)])
Avec un ensemble de données aussi volumineux, vous souhaiterez peut-être la rapidité d’une recherche d’environnement. Vous pouvez utiliser la fonction lookup
du paquet qdapTools comme suit:
library(qdapTools)
alldata$market <- lookup(alldata$Zip, zipcodes[, 2:1])
Ou
alldata$Zip %l% zipcodes[, 2:1]
Voici la manière dplyr
de le faire:
library(tidyverse)
alldata %>%
select(-market) %>%
left_join(zipcodes, by="Zip")
qui, sur ma machine, a à peu près les mêmes performances que lookup
.