这是一个看似简单的R问题,但我在这里看不到确切的答案。我有一个如下所示的数据框(alldata):
Case zip market
1 44485 0
2 44481 0
3 43210 0
有超过350万条记录。
然后,我有第二个数据框,'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 $ zip匹配zipcode数据框中的相应值,为每个案例返回alldata $ market的正确值。我只是在寻找正确的语法,并且像往常一样非常感谢帮助。
答案 0 :(得分:13)
由于您不关心market
中的alldata
列,因此您可以先使用alldata
和zipcodes
中的列将其删除。使用zip
的<{1}}列:
merge
merge(alldata[, c("Case", "zip")], zipcodes, by="zip")
参数指定了关键条件,因此如果您有复合键,则可以执行by
之类的操作。
答案 1 :(得分:5)
另一个对我有用的选项非常简单:
alldata$market<-with(zipcodes, market[match(alldata$zip, zip)])
答案 2 :(得分:3)
使用如此庞大的数据集,您可能需要环境查找的速度。您可以使用qdapTools package中的lookup
功能,如下所示:
library(qdapTools)
alldata$market <- lookup(alldata$zip, zipcodes[, 2:1])
或者
alldata$zip %l% zipcodes[, 2:1]
答案 3 :(得分:1)
以下是dplyr
方式:
library(tidyverse)
alldata %>%
select(-market) %>%
left_join(zipcodes, by="zip")
,在我的机器上,与lookup
大致相同。
答案 4 :(得分:0)
match
的语法有点笨拙。您可能会发现 lookup
包更易于使用。
alldata <- data.frame(Case=1:3, zip=c(44485,44488,43210), market=c(NA,NA,NA))
zipcodes <- data.frame(market=c(1,1,1,2,2), zip=c(44485,44486,44488,43210,43211))
alldata$market <- lookup(alldata$zip, zipcodes$zip, zipcodes$market)
alldata
## Case zip market
## 1 1 44485 1
## 2 2 44488 1
## 3 3 43210 2