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

时间:2015-10-02 14:58:26

标签: r performance loops for-loop assign

我创建了循环,根据某些条件将列值从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.frametab1)有60,000,000个观测值,第二个data.frametab2)有1000个观测值。有没有办法加快这些循环?

1 个答案:

答案 0 :(得分:4)

看起来你正在尝试合并。基础R中有一个merge函数,可以毫无困难地完成您的需要。

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

在基础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))