加速循环以从多个数据帧分配值

Speed up loops to assign values from several data frames

我创建了循环,根据某些条件将 data.frame 的列值分配给另一个 data.frame 的列:

for ( lineTab1 in 1 : dim(tab1)[1] ) {
  for ( lineTab2 in 1 : dim(tab2)[1] ) {
    if ( tab1$id[lineTab1] == tab2$id[lineTab2]) & 
     tab1$year[lineTab1] == tab2$year[lineTab2]) ) {
  tab1$region[lineTab1] <- tab2$region[lineTab2]) }
}
}

我的循环太慢了!第一个 data.frame (tab1) 有 60,000,000 个观察值,第二个 data.frame (tab2) 有 1000 个观察值。有没有办法加快这些循环?

您似乎正在尝试进行合并。基础 R 中有一个 merge 函数,它可能会毫无困难地完成你需要的事情。

请注意,我假设 tab2 只是对 id/year 区域的查找 table。如果 tab2 中还有其他列,那么您可以使用下面的 data.table 解决方案,或者从 tab2

中删除剩余的列

在 base R 中,根据一些实验,您可以预期此合并需要大约 3 分钟。

使用库 dplyr,这减少到大约 5 秒,因为 left_join(tab1, tab2)

使用库 data.table,这只需要大约一秒钟,尽管设置时间稍长:

setDT(tab1)
setDT(tab2)
system.time(tab1[tab2, region := i.region, on=c("id","year")])

对于计时数据,我使用了生成的样本数据

tab2 <- expand.grid(id=1:10, year=2000:2010)
tab2$region <- rnorm(110)
tab1 <- data.frame(id=sample(1:10, 6e7, replace=T), year=sample(2000:2010, 6e7, replace=T))