2015-01-19 2 views
0

이 코드의 속도를 높이려면 도움이 필요합니다!누적 합계가 30 행입니다. 느린 코드 개선 필요

목표는 첫 번째 DF : TPS_Jan7_11h_13h_CheckIMEI의 TPS (초당 트랜잭션)가 레코드 1에서 30까지 누적 된 다음 다시 0으로 재설정하고 다시 수행하는 데이터 프레임을 작성하는 것입니다.

는 그래프 형태로 모습입니다 : 내가 0으로 재설정해야 시퀀스를 만들기 시작 ...

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

내 데이터 세트가 6millions 행 이상이

내 누적 변수. 그런 다음 전체 데이터 세트를 살펴보고 이전 값의 맨 위에 추가합니다.

저는 쿼드 코드 x64 8 기가비트 머신에서 몇 시간 동안 이것을 실행했지만 여전히 실행 중입니다 ... 그래서 ... 천천히!

아이디어를 어떻게 빨리 할 수 ​​있습니까? 테이블이있는 부분 집합 또는 일부 마법?

여기에 코드입니다 :

# 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 
} 

사용자 TPS DF는 단순히 첫 번째 열에서 TPS 열 및 타임 스탬프에 TPS의 목록입니다.

목표는 스프레드 시트 예제에 넣은 것을 다시 작성하는 것이지만 수백만 행에 있습니다!

감사합니다, (30 개) 기록의 그룹으로 데이터 그룹에

사이먼

답변

6

사용 dplyr는 각 그룹의 각 값에 대한 누적 합계를 계산합니다.

여기에 몇 가지 코드가 있습니다. 이 모든 값을 포함하는 일부 정제를 필요로하는주의 - 도움말 : 그

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)) 
+0

생각의 컷 문서를 살펴보고 있지만, 나는 2 = 첫째 + 둘째 누적 합계 ROW1 = 최초의 TPS 값, 행이 필요 ... row3 = first + second + third ... 등등 ... 연결된 스프레드 시트를보십시오. 파란 선은 TPS ... 녹색은 누적됩니다. –

+0

네 말이 맞아. 내가 잘못 읽었다. 죄송합니다. 이 경우 요약 대신 mutate를 사용해야하고 일반 합계 대신 cumsum 함수를 사용해야합니다. 내 코드를 수정하겠습니다. – bsg

+0

지금 시도 할 수는 없지만 단순히 "sum (TPS)"합계를 30 초 단위로 넣으면됩니다. 실제로 누적이 필요합니다. 베이스 R의 cumsum 함수를 찾고 있었는데 단순히 sum 대신 cumsum을 사용할 수 있습니까? –