优化功能:循环中的rbind-对于>;5000行
我有一个dataframe(数据),它包含一个日期+时间的变量和一些其他变量。我想要的是一个新的数据框,其中“旧”df的每一行都是过去15分钟内每个实例的摘要(例如,平均值) 我用下面的代码解决了这个问题(我将变量缩短为1,实际上我大约有26个):优化功能:循环中的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
#####请参见编辑###
图书馆(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次回望是一个计算挑战。添加打印
将增加处理时间。