Простой поиск для вставки значений в кадр данных 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
.