我创建了循环,根据某些条件将列值从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个观测值。有没有办法加快这些循环?
答案 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))