累计总计30行.慢代码需要改进

Sim*_*ult 0 r

需要帮助以加快此代码!

目标是创建一个数据帧,其中第一个DF的TPS(每秒事务数):TPS_Jan7_11h_13h_CheckIMEI将从记录1到30累积,然后重置为0并再次执行此操作.

这是图形形式的样子:

https://docs.google.com/spreadsheets/d/1-286za99C5gdHLDErR9B4ZazVrZFFINGaH3xzVMghFk/edit?usp=sharing

我的数据集有超过600万行......

我开始创建一个序列,我需要将我的累积变量重置为0.然后我浏览完整的数据集,只需添加上一个值.

我已经在四码x64 8gig机器上运行了几个小时并仍在运行......所以...疯狂的慢!

任何想法如何加快这一点?表格的子集或魔法?

这是代码:

# Create a sequence of when to reset the cumulative TPS
TPS_Jan7_11h_13h_CheckIMEI_seq30 <- seq(from = 1,nrow(TPS_Jan7_11h_13h_CheckIMEI),by = 30)

# Initialize Dataframe
TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30 <- data.frame(matrix(ncol = 3, nrow = nrow(Jan7_11h_13h_CheckIMEI)))
colnames(TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30) <- c("CumulTPS","100%","130%")
TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30[2] = 1000*30
TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30[3] = (1000*30)*1.3


CumulVal = 0
TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30$CumulTPS[1] = TPS_Jan7_11h_13h_CheckIMEI$TPS[1]

for(i in 2:nrow(Jan7_11h_13h_CheckIMEI)) {
  CumulVal = CumulVal + TPS_Jan7_11h_13h_CheckIMEI$TPS[i-1]
  TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30$CumulTPS[i] = CumulVal
  # print(CumulVal)
  if (i %in% TPS_Jan7_11h_13h_CheckIMEI_seq30) CumulVal = 0
}
Run Code Online (Sandbox Code Playgroud)

TPS DF只是TPS列上的TPS列表和第一列上的时间戳列表.

目标是重新创建我在电子表格示例中添加的内容,但是数百万行!

谢谢,

西蒙

bsg*_*bsg 6

使用dplyr将数据分组为30个记录的组,然后计算每个组中每个值的累积总和.

这是一些代码; 请注意,它需要一些细化来包含所有值 - 请查看剪切文档以获取帮助:

library(dplyr)

# Create a sequence of when to reset the cumulative TPS
TPS_Jan7_11h_13h_CheckIMEI_seq30 <- seq(from = 1,nrow(TPS_Jan7_11h_13h_CheckIMEI),by = 30)

#use cut() to add a factor column to the data frame with a different level for each group of 30
TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30$numgroup = cut(as.numeric(row.names(TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30)), TPS_Jan7_11h_13h_CheckIMEI_seq30)

#aggregate by the new column and get the cumulative sum at each line, within each group
newdf = TPS_Jan7_11h_13h_CheckIMEI_CumulTPS30 %>% group_by(numgroup) %>% mutate(cumulsum = cumsum(TPS))
Run Code Online (Sandbox Code Playgroud)