在R数据帧中插入值的简单查找
这是一个看似简单的R问题,但我在这里看不到确切的答案。我有一个数据框(alldata),看起来像这样:在R数据帧中插入值的简单查找,r,lookup-tables,R,Lookup Tables,这是一个看似简单的R问题,但我在这里看不到确切的答案。我有一个数据框(alldata),看起来像这样: Case zip market 1 44485 NA 2 44488 NA 3 43210 NA 有350多万条记录 然后,我有第二个数据帧“zipcodes” market zip 1 44485 1 44486 1 44488 ... ... (100
Case zip market
1 44485 NA
2 44488 NA
3 43210 NA
有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的正确值。我只是在寻找正确的语法,非常感谢您一如既往地提供帮助。由于您不关心
alldata
中的market
列,您可以首先使用alldata
将其剥离,然后使用merge
基于zip
列合并zipcodes
:
merge(alldata[, c("Case", "zip")], zipcodes, by="zip")
by
参数指定了键条件,因此如果您有一个复合键,您可以使用如此大的数据集执行类似于by=c(“zip”、“otherfield”)
的操作,您可能需要环境查找的速度。您可以从以下位置使用查找功能:
library(qdapTools)
alldata$market <- lookup(alldata$zip, zipcodes[, 2:1])
以下是执行此操作的dplyr
方法:
library(tidyverse)
alldata %>%
select(-market) %>%
left_join(zipcodes, by="zip")
在我的机器上,它的性能与查找
另一个对我有效且非常简单的选项大致相同:
alldata$market<-with(zipcodes, market[match(alldata$zip, zip)])
alldata$market匹配的语法有点笨拙。您可能会发现查找
包更易于使用
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
要查找的所有数据合并
。搜索[r]merge
,您将发现it@Ricardo3.5上的Saportamerge
可能有点慢。@Tylerlinker,我经常在4亿行上使用merge.data.table
,而且速度相当快。使用qdap
though wow从未处理过这么大的数据。感谢经验丰富的回复。Tyler,我在一个更大的数据上测试了这一点,并且查找(.)
这一步证明很耗时(我在一段时间后停止了它)。我把它当作一个例子。我做得对吗?通过快速调试,耗时的部分似乎是sapply(.)
内部的recoder
函数。@Arun感谢您提供的要点。根据您的发现,我在中添加了一些改进,这些改进显著提高了速度。只是出于好奇,您将data.table
放在了测试台上,以查看其比较结果。我已经阅读了数据。table
在查找方面做了一些很好的改进,包括字符查找。我用两种方法编辑了要点。1) 不过,使用match
和:=
的连接(尽管这里确实不需要)和2)会更好地对海量数据进行基准测试。是的,从1.9.0+到现在有很多值得欢迎的变化。这应该是令人信服的:require(data.table);结实种子(1L);x=样品(0(“V”,1:1e6));system.time(ans1)非常简单,但也非常棒!如果你能解释一下那里发生了什么,那就太好了。在R文档中:“match
返回第一个参数在第二个参数中(第一个)匹配位置的向量”因此,基本上,match
返回一个正确的索引向量,以访问zipcodes$market,为alldata$market获取正确的市场值。这不会为不在alldata中的邮政编码引入NAs吗?@Rodrigo默认情况下,您将只获得两个数据帧中都匹配的行。这可以通过all
,all.x ,和all.y
选项
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