Qiqi Zhang
Qiqi Zhang

Reputation: 23

how to write Date in a loop in R?

Here's my dumb code which I think could have a simple way to write it in a for loop. But I dont know how to make i as the year (2008-2014) of the date. Thanks for your help.

BTW: I know this may seem too simple for some skilled R users, but not for me. So please do not minus the vote. Thanks for your kindness.

data3[,2][data3$Date<"2014-09-01" & data3$Date>"2014-08-01"]<-NA
data3[,2][data3$Date<"2013-09-01" & data3$Date>"2013-08-01"]<-NA
data3[,2][data3$Date<"2012-09-01" & data3$Date>"2012-08-01"]<-NA
data3[,2][data3$Date<"2011-09-01" & data3$Date>"2011-08-01"]<-NA
data3[,2][data3$Date<"2010-09-01" & data3$Date>"2010-08-01"]<-NA
data3[,2][data3$Date<"2009-09-01" & data3$Date>"2009-08-01"]<-NA
data3[,2][data3$Date<"2008-09-01" & data3$Date>"2008-08-01"]<-NA

Upvotes: 1

Views: 359

Answers (1)

akrun
akrun

Reputation: 886948

One way would be:

indx1 <- seq(as.Date('2008-08-01'), length.out=7, by='1 year')
indx2 <- seq(as.Date('2008-09-01'), length.out=7, by='1 year')
data3[,2] <- data3[,2]*(Reduce(`&`,Map(function(x,y) {
                     data3[,2][x < data3[,1] & data3[,1] < y] <- NA
                     data3[,2]},
                     indx1, indx2)))

Or

data3[unlist(Map(function(x,y,z) which(y <x & x < z) ,
                 list(data3[,1]), indx1, indx2)),2] <- NA

Or using a for loop

 l1 <- vector('list', length(indx1))
 for(i in seq_along(indx1)){
     l1[[i]] <- which(indx1[i] < data3[,1] & data3[,1] < indx2[i])
  }

 data3[unlist(l1),2] <- NA

data

set.seed(24)
data3 <- data.frame(Date=seq(as.Date('2008-07-01'), length.out=150,
                         by='20 days'), val=rnorm(150))

Upvotes: 1

Related Questions