2014-11-20 4 views
0

I А есть таблица:Группировка дат по периодам в R

Date  Value1 Value2 ... 
09/01/2008   
10/01/2008 
11/01/2008 
12/01/2008 
01/01/2009 
02/01/2009 
03/01/2008 
04/01/2009 
05/01/2009 
06/01/2009 
07/01/2009 
08/01/2008 

Мне нужно сгруппировать даты следующий путь: 09/01/2008 10/01/2008 11/01/2008 сделать равным «2008 "и даты остальные делают равным„2008.2009“

можно ли сделать что-то вроде этого:

Date[Date>=09/01/2008 & Date<=11/01/2008] <- 2008 
Date[Date>=12/01/2008 & Date<=08/01/2009] <- 2008.2009 

выход должен быть в следующем формате:

Date  Value1 Value2 ... 
2008   
2008 
2008 
2008.2009 
2008.2009 
2008.2009 
2008.2009 
2008.2009 
2008.2009 
2008.2009 
2008.2009 
2008.2009 

Спасибо!

+0

Для того, чтобы сделать диапазоны нужно либо преобразовать в реальные Дата-классифицироваться векторов или переставлять даты, чтобы значения года появляются первые в формате ГГГГ/ММ/ДД. Кроме того, у вас есть два значения: 03/01/2008 и 08/01/2008, которые не согласуются с вашим определением. –

ответ

2
dat <-read.table(text="Date 
09/01/2008   
10/01/2008 
11/01/2008 
12/01/2008 
01/01/2009 
02/01/2009 
03/01/2009 
04/01/2009 
05/01/2009 
06/01/2009 
07/01/2009 
08/01/2009",head=T) 

dat$dt <- with(dat, as.Date(Date,format="%m/%d/%Y")) 

with(dat, c("2008", "2008.2009", "NA")[ findInterval(dt, 
              c(as.Date("2008/09/01") , 
               as.Date("2008/11/02") , 
               as.Date("2009/08/02")) 
                ) 
             ]) 

# [1] "2008"  "2008"  "2008"  "2008.2009" "2008.2009" "2008.2009" 
# [7] "2008.2009" "2008.2009" "2008.2009" "2008.2009" "2008.2009" "2008.2009" 

Вы должны заранее некоторые даты на 1 день, так что findInterval может следовать вашей несколько нерегулярного использования «> =» и «< =»

2

Если даты в вашем диапазоне набора данных только с 2008/09/01 по 2009/08/01 и требуется только 2-летние группы, вы можете попытаться сделать это ниже, используя data.table.

# Use @BondedDust toy data 
library(data.table) 
setDT(dat) # convert to data table 
dat[, new_col := ifelse(dt %between% c("2008-09-01", "2008-11-01"), 
         "2008", "2008.2009")] 
dat 

# you get 
      Date   dt new_col 
1: 09/01/2008 2008-09-01  2008 
2: 10/01/2008 2008-10-01  2008 
3: 11/01/2008 2008-11-01  2008 
4: 12/01/2008 2008-12-01 2008.2009 
5: 01/01/2009 2009-01-01 2008.2009 
6: 02/01/2009 2009-02-01 2008.2009 
7: 03/01/2009 2009-03-01 2008.2009 
8: 04/01/2009 2009-04-01 2008.2009 
9: 05/01/2009 2009-05-01 2008.2009 
10: 06/01/2009 2009-06-01 2008.2009 
11: 07/01/2009 2009-07-01 2008.2009 
12: 08/01/2009 2009-08-01 2008.2009 
+0

Справа. Я начал с такого подхода и даже написал код, но пошел для метода findInterval, потому что он лучше обобщается. –

Смежные вопросы