简单查找以在R数据帧中插入值

时间:2013-07-24 20:24:36

标签: r lookup-tables

这是一个看似简单的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的正确值。我只是在寻找正确的语法,并且像往常一样非常感谢帮助。

5 个答案:

答案 0 :(得分:13)

由于您不关心market中的alldata列,因此您可以先使用alldatazipcodes中的列将其删除。使用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