【发布时间】:2018-12-03 00:47:40
【问题描述】:
我目前正在处理一个大型数据框,并且必须为多个变量创建多个长度的滚动总和。我有一个通过data.table 的工作方法,但是运行一个变量需要相当长的时间(每个变量大约需要 50 分钟)。
我花了一些时间改进脚本以加快它的速度,但已经没有想法了。我没有 C++ 经验,但认为Rcpp 包可能是一种选择。我自己研究过它,但还没有想出任何可用的东西。
这是我的 data.table 一个变量的脚本
df_td <- setDT(df_1, key=c("Match","Name"))[,by=.(Match, Name), paste0("Period_", 1:10)
:= mclapply((1:10)*600, function(x) rollsumr(Dist, x, fill = NA))][]
我使用了parallel::mclapply,这很有帮助,但仍然需要很长时间才能工作。
> dput(head(df_1, 20))
structure(list(Match = c("Bath_A", "Bath_A", "Bath_A", "Bath_A",
"Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A",
"Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A", "Bath_A",
"Bath_A", "Bath_A"), Name = c("Jono Lance", "Jono Lance", "Jono Lance",
"Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance",
"Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance",
"Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance", "Jono Lance",
"Jono Lance", "Jono Lance"), Dist = c(0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Dist_HS = c(0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), Dist_SD = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
-20L), class = c("tbl_df", "tbl", "data.frame"))
> str(df_1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 26533771 obs. of 5 variables:
$ Match : chr "Bath_A" "Bath_A" "Bath_A" "Bath_A" ...
$ Name : chr "Jono Lance" "Jono Lance" "Jono Lance" "Jono Lance" ...
$ Dist : num 0 0 0 0 0 0 0 0 0 0 ...
$ Dist_HS: num 0 0 0 0 0 0 0 0 0 0 ...
$ Dist_SD: num 0 0 0 0 0 0 0 0 0 0 ...
任何如何加快速度的建议将不胜感激
【问题讨论】:
-
如果数据集可以缩小,您可能想后退一两步(在您创建这个庞大的数据集之前)?也许你的数据集中有很多零
-
数据集是由近 400 个单独的文件创建的,我曾考虑将它们保持为列表格式,但对我来说不是更快吗?就零而言,数据基于 GPS 距离,每 0.1 秒数据一次,因此每个文件的开头都有一些零,但每个文件的数量不同
标签: r data.table rcpp zoo