Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R数据帧中插入值的简单查找_R_Lookup Tables - Fatal编程技术网

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

在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

这是一个看似简单的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 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上的Saporta
merge
可能有点慢。@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