2016-08-31 6 views
-1

나는 2003 년 이래로 강우량의 기록이있는 데이터 세트를 가지고있다. 또 다른 데이터 세트는 2003 년부터 지금까지의 샘플링 날짜 정보를 포함하고있다. 샘플링 날짜 사이의 비를 합산하려고합니다 (date.per.year이라는 객체 참조).R에서 시간 범위 사이의 값의 합을 계산하는 방법?

I found this 그러나 값의 벡터를 사용하고 싶습니다 (간격 [X, Y [, c2 = 합계 (비가 [Y, Z [c3 = sum Z, A [등)

date.per.year = structure(c(12110, 12460, 12815, 13196, 13564.5, 13930, 14321, 
          14652, 15028, 15408, 15792, 16106), .Names = c("2003", "2004", 
                      "2005", "2006", "2007", "2008", "2009", "2010", "2011", "2012", 
                      "2013", "2014")) 

날짜 및 비 데이터 프레임인지 상상이 :

df = data.frame(Dates = seq(as.Date("2003/1/1"), 
          as.Date("2015/1/1"), "days"), 
       rain = rnorm(length(seq(as.Date("2003/1/1"), as.Date("2015/1/1"), "days")))) 

I에게 also tried this하지만 사용할 수있는 쓰레기통 만드는 아니에요 :

## create corresponding intervals 
splits <- cut(date.per.year, median, breaks=date.per.year) 

Warning message: 
In split.default(df$rain, f = splits) : 
    data length is not a multiple of split variable 


## split df$rain into intervals and sum them 
lapply(split(df$rain, f=splits), sum) 

또는 even this는 :

library(data.table) 
DT <- data.table(df) 
setkey(DT, rain, Dates) 

DT[, sumSum := DT[ .(.BY[[1]], .d+(-5:-1))][, sum(sum, na.rm=TRUE)] , by=list(date.per.year, .d=Dates)] 
Error in `[.data.table`(DT, , `:=`(sumSum, DT[.(.BY[[1]], .d + (-5:-1))][, : The items in the 'by' or 'keyby' list are length (12,4384). Each must be same length as rows in x or number of rows returned by i (4384). 

DT 

내가하고 싶은 것을의 그림은 다음과 같습니다. 빨간색 선은 내가 합산하고자하는 범위를 만드는 날짜라고 가정합니다 (이는 date.per.year 개체 임). 결국, 나는 다른 범위의 합계 11 값을 가져야한다. 이것을 할 수 있습니까?

enter image description here

답변

1

당신은 날짜 시간 객체에 그 수치를 변환 원점을 제공해야합니다. 그렇지 않으면 오류 메시지가 나타납니다. 이후,이 변수를 기반으로하는 커팅은 간단합니다.

cuts <- as.Date(date.per.year, origin = as.Date("1970/1/1")) 
binned <- cut(df$Dates, 
       breaks = cuts) 

N.B. 중단 점은 포괄적이므로 첫 번째 및 마지막 여러 값에 대해 df$DatesNA이됩니다.

당신은 예를 들어, 일자와 시간 요소의 독특한 수준이 그룹 현명한 합 당으로

unique(binned) 
[1] <NA>  2003-02-27 2004-02-12 2005-02-01 2006-02-17 
[6] 2007-02-20 2008-02-21 2009-03-18 2010-02-12 2011-02-23 
[11] 2012-03-09 2013-03-28 
11 Levels: 2003-02-27 2004-02-12 2005-02-01 ... 2013-03-28 

이다 것을 알 수 있습니다, 당신이 이것을 달성하는 데 도움이 될 수있다 스택 오버플로 게시물의 수천이있다. 당신은, 예를 들어 수

df %>% mutate(binned = cut(Dates, breaks =cuts)) %>% 
    group_by(binned) %>% summarize(sum(rain)) 

# A tibble: 12 x 2 
     binned sum(rain) 
     <fctr>  <dbl> 
1 2003-02-27 7.996658 
2 2004-02-12 -11.950646 
3 2005-02-01 30.443479 
4 2006-02-17 19.687989 
5 2007-02-20 -2.088648 
6 2008-02-21 33.837560 
7 2009-03-18 -5.039810 
8 2010-02-12 -5.235960 
9 2011-02-23 -9.806273 
10 2012-03-09 -3.887545 
11 2013-03-28 30.446548 
12   NA 36.634249 

은 행 (12)의 NA 모두 2003년 2월 27일 전 2013년 3월 28일 후 비의 총합을 나타낸다는 것을 기억하십시오.

관련 문제