Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化功能:循环中的rbind-对于>;5000行_R_List_Loops_For Loop_Rbind - Fatal编程技术网

优化功能:循环中的rbind-对于>;5000行

优化功能:循环中的rbind-对于>;5000行,r,list,loops,for-loop,rbind,R,List,Loops,For Loop,Rbind,我有一个dataframe(数据),它包含一个日期+时间的变量和一些其他变量。我想要的是一个新的数据框,其中“旧”df的每一行都是过去15分钟内每个实例的摘要(例如,平均值) 我用下面的代码解决了这个问题(我将变量缩短为1,实际上我大约有26个): #####请参见编辑### 图书馆(lubridate) #参考df,以便稍后启动rbind CUKS 由于您需要滚动平均值,请考虑 SpAp> : new_df <- data.frame( unix_timestam

我有一个dataframe(数据),它包含一个日期+时间的变量和一些其他变量。我想要的是一个新的数据框,其中“旧”df的每一行都是过去15分钟内每个实例的摘要(例如,平均值)

我用下面的代码解决了这个问题(我将变量缩短为1,实际上我大约有26个):

#####请参见编辑###
图书馆(lubridate)
#参考df,以便稍后启动rbind

CUKS

由于您需要滚动平均值,请考虑<代码> SpAp> <代码>:

new_df <- data.frame(
            unix_timestamp = as.POSIXct(data[,1]),
            rolling_15_mean = sapply(1:nrow(data), 
                                     function(i) mean(data$Var[as.POSIXct(data[,1]) > (as.POSIXct(data[i,1]) - 60*15)
                                                               & as.POSIXct(data[,1]) <= as.POSIXct(data[i,1])])
            )
          )

由于您需要滚动平均值,请考虑<代码> sPix<代码>:

new_df <- data.frame(
            unix_timestamp = as.POSIXct(data[,1]),
            rolling_15_mean = sapply(1:nrow(data), 
                                     function(i) mean(data$Var[as.POSIXct(data[,1]) > (as.POSIXct(data[i,1]) - 60*15)
                                                               & as.POSIXct(data[,1]) <= as.POSIXct(data[i,1])])
            )
          )

永远不要在循环中使用
rbind
:根据需要预先分配
列表(
pre-Why?在每次调用
rbind
时,它都在复制所有数据。每次。当它只有几行时,这可能相对可以忽略不计,但随着它们的增长,需要复制的数据越来越多。请给出一些示例数据和预期的输出,谢谢!我猜现在使用列表方法会更快。However,我想知道使用帮助数据框的方式是否是最好的解决方案,或者我是否可以对函数进行更多的调优?好的。我使用3000行的数据框进行了测试,结果还可以。当我使用20000行的数据集运行此代码时,它需要大约一个(!)每行第二个!有人知道如何提高性能吗?永远不要在循环中使用
rbind
:根据需要预先分配
list
pre-Why?在每次调用
rbind
时,它都在复制所有数据。每次。当它只有几行时,这可能相对可以忽略不计,但随着它们的增长,需要复制的数据越来越多。请给出一些示例数据和预期的输出,谢谢!我猜现在使用列表方法会更快。However,我想知道使用帮助数据框的方式是否是最好的解决方案,或者我是否可以对函数进行更多的调优?好的。我使用3000行的数据框进行了测试,结果还可以。当我使用20000行的数据集运行此代码时,它需要大约一个(!)每行每秒!是否有人有关于如何提高性能的提示?谢谢。输出是正确的,但所花费的时间与使用列表方法之前的解决方案相似(但是,我无法看到超过20000行的df的进度)。我假设这是因为我现在在data.frame函数中有26个单独的sapply函数,其中“help”数据框是针对每一列单独计算的。还是我错了,我可以用另一种更有效的方法来处理“help”df只计算一次?在一天结束时,sapply是一个循环。此解决方案进一步简化了您的流程,避免了中间列表和数据帧绑定的簿记。我添加了一个
vapply
备选方案,这可能会略有帮助。但15分钟增量过滤器的20000次回望是一个计算挑战。添加
print
将增加处理时间。谢谢。输出是正确的,但所花费的时间与使用列表方法之前的解决方案相似(但是,我无法看到我的df超过20000行的进度)。我假设这是因为我现在在data.frame函数中有26个单独的sapply函数,其中“帮助”数据框是针对每一列单独计算的。还是我错了,我可以用一种不同的、更有效的方法来处理“帮助”数据框"df只计算一次?在一天结束时,sapply是一个循环。此解决方案进一步简化了您的流程,避免了中间列表和数据帧绑定的簿记。我添加了一个
vapply
备选方案,这可能会略有帮助。但15分钟增量过滤器的20000次回望是一个计算挑战。添加
打印
将增加处理时间。