我需要以最快的方式执行大约数千个左连接,因为我想重复几千次。执行大约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")
}
答案 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
来处理和合并块(可能并行)。