加速循环以从多个数据帧分配值
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))
我创建了循环,根据某些条件将 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))