Hi all,
I was wondering if you can help me with the following situation:
I have a data frame that includes weather station data for 30 years in
the form:
YEAR, MONTH, DAY, TEMP
1970, 01, 01, -15
...
1999, 12, 31, -21
I would like to add another variable "JULIAN" that assigns the
integers
1 to 365 (and 1 to 366 for leap years) for each day of a year over
multiple years.
Here is what I came up with:
counter<-1
for(i in 1:12){
for (j in 1:31){
df$JULIAN[df$MONTH==i & stn$DAY==j]<- counter
counter<-counter+1
}
}
R does it exactly what I told it to but I am not satisfied with it since
it doesn't stop assigning the integers when months have 28, 29 or 30
days. For instance on Feb-28 JULIAN is 59 and on March-1 it's 64, as
opposed to be 60.
I am assuming it must be an ifelse statement, and I was messing around
with it already but without success.
I guess I am missing some vocabulary here and hope someone can give me
some pointers.
Thanks,
Stefan
[[alternative HTML version deleted]]
Perhaps this is easier: convert your data to Date objects and use the yday (year day) function from the lubridate package: i.e., something like this: jd <- apply(DAT, 1, function(x) as.Date(paste(x, collapse = " "), format = "%Y %m %d") # Just a guess you might have to debug it a little yday(jd) It will also be generally easier to use proper Date objects in R anyways :-) Hope this helps, Michael On Mon, Apr 30, 2012 at 7:57 PM, Schreiber, Stefan <Stefan.Schreiber at ales.ualberta.ca> wrote:> Hi all, > > I was wondering if you can help me with the following situation: > > I have a data frame that includes weather station data for 30 years in > the form: > > YEAR, MONTH, DAY, TEMP > 1970, 01, 01, -15 > ... > 1999, 12, 31, -21 > > I would like to add another variable "JULIAN" that assigns the integers > 1 to 365 (and 1 to 366 for leap years) for each day of a year over > multiple years. > > Here is what I came up with: > > counter<-1 > > for(i in 1:12){ > for (j in 1:31){ > > df$JULIAN[df$MONTH==i & stn$DAY==j]<- counter > counter<-counter+1 > } > } > > R does it exactly what I told it to but I am not satisfied with it since > it doesn't stop assigning the integers when months have 28, 29 or 30 > days. For instance on Feb-28 JULIAN is 59 and on March-1 it's 64, as > opposed to be 60. > > I am assuming it must be an ifelse statement, and I was messing around > with it already but without success. > > I guess I am missing some vocabulary here and hope someone can give me > some pointers. > > Thanks, > Stefan > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
I don't really work with dates but thought I'd pass a solution on. ?I
think that there some great packages for handling dates though (lubridate) and
you may want to convert your data to a true date instead of separate columns.
# FUNCTION TO INDEX DATES
date.int <- function(month, year, day){
? ? yearLength <- function(year) year %% 4 == 0
? ? key1 <- data.frame(m=1:12, nm=c(31, 28, 31, 30, 31, 30, 31, 30, 31, 31,
30, 31))
? ? key1$sum <- c(0, cumsum(key1$nm)[-12])
? ? key2 <- data.frame(m=1:12, nm=c(31, 29, 31, 30, 31, 30, 31, 30, 31, 31,
30, 31))
? ? key2$sum <- c(0, cumsum(key2$nm)[-12])
? ? ifelse(yearLength(year), key1[month-1, 3] + day, key2[month-1, 3] + day)
}
#TRY IT OUT ON A MADE UP DATA SET
M <- sort(sample(seq(as.Date("2000/1/1"), by="day",
length.out=1000), 10))
N <- do.call(rbind, strsplit(as.character(M), "\\-"))
N <- data.frame(apply(N, 2, as.numeric))
colnames(N) <- c('year', 'month', 'day')
with(N, date.int(month=month, year=year, day=day))
----------------------------------------> Date: Mon, 30 Apr 2012 17:57:02 -0600
> From: Stefan.Schreiber at ales.ualberta.ca
> To: r-help at r-project.org
> Subject: [R] for loop problem
>
> Hi all,
>
> I was wondering if you can help me with the following situation:
>
> I have a data frame that includes weather station data for 30 years in
> the form:
>
> YEAR, MONTH, DAY, TEMP
> 1970, 01, 01, -15
> ...
> 1999, 12, 31, -21
>
> I would like to add another variable "JULIAN" that assigns the
integers
> 1 to 365 (and 1 to 366 for leap years) for each day of a year over
> multiple years.
>
> Here is what I came up with:
>
> counter<-1
>
> for(i in 1:12){
> for (j in 1:31){
>
> df$JULIAN[df$MONTH==i & stn$DAY==j]<- counter
> counter<-counter+1
> }
> }
>
> R does it exactly what I told it to but I am not satisfied with it since
> it doesn't stop assigning the integers when months have 28, 29 or 30
> days. For instance on Feb-28 JULIAN is 59 and on March-1 it's 64, as
> opposed to be 60.
>
> I am assuming it must be an ifelse statement, and I was messing around
> with it already but without success.
>
> I guess I am missing some vocabulary here and hope someone can give me
> some pointers.
>
> Thanks,
> Stefan
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.