2016-10-05 5 views
1

에 따라 부분 집합 시계열 data.frame 당신은 어떻게 시간을 기준으로 시계열 data.frame 및 임계 값을 부분 집합 것인가?R - 시간과 임계 값

나는이 데이터를 가지고 :

다음과 같습니다
year <- seq(2000, 2009, 1) 
v1 <- sample(1:10, 10, replace=T) 
df <- data.frame(year, v1) 

:

v1에 합산 점수의 값을 초과하는
> df 
    year v1 
1 2000 9 
2 2001 4 
3 2002 5 
4 2003 4 
5 2004 5 
6 2005 3 
7 2006 3 
8 2007 3 
9 2008 9 
10 2009 6 

내가 순차적 년의 그룹에 의해 데이터를 부분 집합 할 이 예제 데이터 10.

최초의 부분 집합 올해의 관찰 2000 & 2001 년 제 2 서브 세트의 수오을 보유해야 LD 년의 관찰을 잡고 2002, 2003 및 2004

실제 데이터가 120년 포함하는 약 800 만 관찰이있다.

+1

귀하의 입력을위한'sample' –

답변

2

당신은 사용자 정의 cumsum 사용 Reduce 기능을 구현 합이 10을 초과 할 때 합계를 재설정하고 동시에 그룹의 변수로 카운트 증가 할 수 있습니다

library(data.table) 
transpose(Reduce(function(x, y) if(x[1] > 10) c(y, x[2]+1) else c(x[1] + y, x[2]), 
       init = c(0, 1), df$v1, accumulate = T))[[2]][-1] 

# here the init parameter will take two parameters, the first one keep track of the cumsum, 
# and the second one serves as a group variable, when the sum exceeds 10, reset the sum to 
# zero and increase the group variable by one 

# [1] 1 1 2 2 2 3 3 3 3 4 

그것은 10 백만 이상 실행하는 데 약 20 초가 걸립니다를 관찰 벡터 :

v = sample(1:10, 10000000, replace = T) 
system.time(transpose(Reduce(function(x, y) if(x[1] > 10) c(y, x[2]+1) else c(x[1] + y, x[2]), init = c(0, 1), v, accumulate = T))[[2]]) 

# user system elapsed 
# 19.509 0.552 20.081 
+0

감사를 사용하여 예제를 만들'set.seed'을 사용하십시오. 이것은 훌륭하게 작동하며 내가 찾는 대답입니다. 이 코드를 사용하는 경우, 출력은'df'와 1보다 더 관찰이있다. 이게 어디서 온 것 같니? –

+1

아, 멋지다. 그것은'Reduce' 함수에 전달 된 초기 매개 변수에서옵니다. 넌) 함수 (X, Y (경우 (X [1]> 10) (C) (Y, X [2] +1) 다른 C (X가 (트랜스 감소 '로 제외 [1] + Y, X [2])를 초기화하기 = C (0, 1), $ V1 df라고 축적 = T)) [2] [- 1] '. – Psidom