Простой поиск для вставки значений в кадр данных R

Это, казалось бы, простой вопрос R, но я не вижу здесь точного ответа. У меня есть кадр данных (alldata), который выглядит так:

Case     zip     market
1        44485   0
2        44481   0
3        43210   0

Есть более 3,5 миллионов записей.

Затем у меня есть второй фрейм данных, "zipcodes".

market    zip
1         44485
1         44486
1         44488
...       ... (100 zips in market 1)
2         43210
2         43211
...       ... (100 zips in market 2, etc.)

Я хочу вернуть правильное значение для рынка alldata $для каждого случая на основе alldata $zip, соответствующего соответствующему значению в фрейме данных zipcode. Я просто ищу правильный синтаксис, и помощь, как обычно, очень ценится.

Ответ 1

Поскольку вы не заботитесь о столбце market в alldata, вы можете сначала отключить его, используя и объединить столбцы в alldata и zipcodes на основе столбца zip, используя merge

merge(alldata[, c("Case", "zip")], zipcodes, by="zip")

Параметр by указывает ключевые критерии, поэтому, если у вас есть составной ключ, вы можете сделать что-то вроде by=c("zip", "otherfield").

Ответ 2

С таким большим набором данных вам может потребоваться скорость поиска в среде. Вы можете использовать функцию lookup из qdapTools package следующим образом:

library(qdapTools)
alldata$market <- lookup(alldata$zip, zipcodes[, 2:1])

или

alldata$zip %l% zipcodes[, 2:1]

Ответ 3

Другой вариант, который работал у меня и очень прост:

alldata$market<-with(zipcodes, market[match(alldata$zip, zip)])

Ответ 4

Здесь dplyr способ сделать это:

library(tidyverse)
alldata %>%
  select(-market) %>%
  left_join(zipcodes, by="zip")

который на моей машине примерно соответствует производительности lookup.