web-dev-qa-db-fra.com

Recherche simple pour insérer des valeurs dans un cadre de données R

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.

11
Dino Fire

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").

13
Dan Garant

Une autre option qui a fonctionné pour moi et qui est très simple:

alldata$market<-with(zipcodes, market[match(alldata$Zip, Zip)])
5
juandelsur

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]
3
Tyler Rinker

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.

1
James Brusey