成千上万的连续加入,需要在R

时间:2016-06-20 17:28:40

标签: r performance join

我需要以最快的方式执行大约数千个左连接,因为我想重复几千次。执行大约1000次连接大约需要60次。我对此并不满意。有人看到我怎样才能加速这个计算?

所以我得到了一个data.frame列表,我希望通过密钥id_client与data.table连接。 table0 是一个data.table。 list_of_dataframe 的元素是data.frames

这是我的代码:

setkey(table0,id_client)
for (i in seq(1,length(list_of_dataframe))){
table0=merge(table0,setkey(setDT(list_of_dataframe[[i]]),id_client),
             all.x=TRUE,by.x="id_client",by.y="id_client")
  }

1 个答案:

答案 0 :(得分:2)

如果整个集合可以适合内存,那么最好连接return inflater.inflate(R.layout.fragmentmodalidad, container, false);然后只进行一次合并。

此代码仅设置1000个数据帧的列表,每个数据帧包含2250行:

list_of_dataframe

这是连接和合并,在我的机器上大约需要12秒:

library(pacman)
p_load(data.table, foreach, tictoc)    
size.df = 2250
num.df = 1000

foreach(i=seq(1,size.df*num.df,size.df)) %do% {
  data.frame(id_unique=i:(i+size.df-1),
             id_client=sample(i:(i+size.df-1), size.df, replace=TRUE),
             value=rnorm(size.df))
} -> list_of_dataframe

table0 = data.table(id_client=1:(size.df*num.df))  

请注意,添加了唯一的id列以允许非独特的id_client。你必须以某种方式处理这个问题。如果您希望重复项为列而不是行,则可以根据需要重新整形。

> tic()
> merge(table0, do.call('rbind', list_of_dataframe),
        all.x=TRUE, by='id_client') -> result
> toc()
12.178 sec elapsed

如果无法将所有内容都安装在内存中,则可以使用> head(result) id_client id_unique value 1: 1 725 -0.8468212 2: 2 NA NA 3: 3 1066 -0.1352698 4: 3 1906 -0.5246030 5: 4 NA NA 6: 5 1732 -0.1328604 foreach来处理和合并块(可能并行)。