Frage

I have 36 files where each file contains data for one month for a certain year, so in total I have 36/12=3 years. Files from 1 to 12 are for year 2013, 13 to 24 for year 2012, and 25 to 36 for year 2011. I am trying to create a function that will take a year or years as an argument and return corresponding interval of file numbers. My attempt:

g<-function(year){
 lis<-vector()
 for( i in year){
  if(year==2013){lis<-append(lis,1:12)}
  if(year==2012){lis<-append(lis,13:24)}
  if(year==2011){lis<-append(lis,24:36)}
 }
return(lis)
}

With single years my function works fine. For example:

> g(2013)
[1]  1  2  3  4  5  6  7  8  9 10 11 12

I want the following output when I call g(2013:2012) or g(2012:2013):

[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

I thought if statements would do the trick, but it does not work. Let me know if you need any clarification. Thanks for your help.

War es hilfreich?

Lösung

In your for loop, you don't actually use the individual values that you're looping through, you compare against the whole year vector every time. Using the individual values fixes your immediate problem:

g<-function(year){
  lis<-vector()
  for( i in year){
    if(i == 2013){lis<-append(lis,1:12)}
    if(i == 2012){lis<-append(lis,13:24)}
    if(i == 2011){lis<-append(lis,24:36)}
  }
  return(lis)
}

Or you could do the same thing without a for loop:

g2 <-function(year){
  lis<-vector()
  if (2013 %in% year) {lis <- append(lis, 1:12)}
  if (2012 %in% year) {lis <- append(lis, 13:24)}
  if (2011 %in% year) {lis <- append(lis, 24:36)}
  return(lis)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top