Hello, You have a '{' too many. for(i in 1972:1985){ if(DF$year==i & DF$month %in% 1:9){ DF$wyear <- i }else{ DF$wyear < i-1 } } } I believe this is it. Hope this helps, Rui Barradas Em 04-07-2017 19:31, lily li escreveu:> Hi R users, > I have a question about adding a column for water year. The dataframe has > the structure below. But the wyear column just shows one year. Could anyone > help me with this problem? Thanks. > > DF > year month day time flow > 1972 1 1 1972-01-01 5 > 1972 1 2 1972-01-02 5.5 > 1972 1 3 1972-01-03 6 > ... > 1985 12 31 1985-12-31 6 > > > for(i in 1972:1985){ > if(DF$year==i & DF$month %in% 1:9){ > DF$wyear <- i { > }else{ > DF$wyear < i-1 > } > } > } > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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. >
Hi R users, I have a question about adding a column for water year. The dataframe has the structure below. But the wyear column just shows one year. Could anyone help me with this problem? Thanks. DF year month day time flow 1972 1 1 1972-01-01 5 1972 1 2 1972-01-02 5.5 1972 1 3 1972-01-03 6 ... 1985 12 31 1985-12-31 6 for(i in 1972:1985){ if(DF$year==i & DF$month %in% 1:9){ DF$wyear <- i { }else{ DF$wyear < i-1 } } } [[alternative HTML version deleted]]
Well, let's see: 1) You do not appear to understand basic flow control statements in R. Note that (from ?if): if(cond) expr if(cond) cons.expr else alt.expr where "cond A length-one logical vector that is not NA." Your cond is a vector of length nrow(DF), so you don't want if, you want ifelse(). Did you fail to show us your warning messages?? 2. Revising your code and eliminating the extraneous brackets, one gets: for(i in 1972:1985){ ifelse(DF$year==i & DF$month %in% 1:9, DF$wyear <- i, DF$wyear < i-1) } But that doesn't work either, giving only 1985. Why? -- because the assignment statement DF$wyear <- i assigns the single value i to the whole column. So the whole column gets the last value of 1985, which is presumably what you saw but neglected to tell us. 3. That can be fixed by ditching the loop and ising ifelse() properly: DF$wyear <-ifelse(DF$month %in% 1:9,DF$year ,DF$year-1) or even more succinctly, albeit with a trick (automatic coercion of logical to numeric) DF$wyear <- DF$year - (DF$month %in% 10:12) This is an example of vectorization, a powerful feature of R that would be worthwhile for you to learn. Your initial use of a C like for() loop should be avoided when possible, as it could be here. If I have made an error in understanding what you are doing, please do let us all know. I get it wrong from time to time. Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Tue, Jul 4, 2017 at 11:31 AM, lily li <chocold12 at gmail.com> wrote:> Hi R users, > I have a question about adding a column for water year. The dataframe has > the structure below. But the wyear column just shows one year. Could anyone > help me with this problem? Thanks. > > DF > year month day time flow > 1972 1 1 1972-01-01 5 > 1972 1 2 1972-01-02 5.5 > 1972 1 3 1972-01-03 6 > ... > 1985 12 31 1985-12-31 6 > > > for(i in 1972:1985){ > if(DF$year==i & DF$month %in% 1:9){ > DF$wyear <- i { > }else{ > DF$wyear < i-1 > } > } > } > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.
Thanks, it works. Yes, I got the same error message when tried my original code and Rui's code: In if (DF$year == i & DF$month %in% 1:9) { ... : the condition has length > 1 and only the first element will be used Also, I think I made a mistake, it should be i+1 rather than i-1. Otherwise, it has no problem. On Tue, Jul 4, 2017 at 1:20 PM, Bert Gunter <bgunter.4567 at gmail.com> wrote:> Well, let's see: > > 1) You do not appear to understand basic flow control statements in R. > > Note that (from ?if): > > if(cond) expr > if(cond) cons.expr else alt.expr > > where > "cond A length-one logical vector that is not NA." > > Your cond is a vector of length nrow(DF), so you don't want if, you > want ifelse(). > Did you fail to show us your warning messages?? > > 2. Revising your code and eliminating the extraneous brackets, one gets: > > for(i in 1972:1985){ > ifelse(DF$year==i & DF$month %in% 1:9, DF$wyear <- i, > DF$wyear < i-1) > } > > But that doesn't work either, giving only 1985. Why? -- because the > assignment statement DF$wyear <- i assigns the single value i to the > whole column. So the whole column gets the last value of 1985, which > is presumably what you saw but neglected to tell us. > > 3. That can be fixed by ditching the loop and ising ifelse() properly: > > DF$wyear <-ifelse(DF$month %in% 1:9,DF$year ,DF$year-1) > > or even more succinctly, albeit with a trick (automatic coercion of > logical to numeric) > > DF$wyear <- DF$year - (DF$month %in% 10:12) > > > This is an example of vectorization, a powerful feature of R that > would be worthwhile for you to learn. Your initial use of a C like > for() loop should be avoided when possible, as it could be here. > > If I have made an error in understanding what you are doing, please do > let us all know. I get it wrong from time to time. > > Cheers, > Bert > > Bert Gunter > > "The trouble with having an open mind is that people keep coming along > and sticking things into it." > -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) > > > On Tue, Jul 4, 2017 at 11:31 AM, lily li <chocold12 at gmail.com> wrote: > > Hi R users, > > I have a question about adding a column for water year. The dataframe has > > the structure below. But the wyear column just shows one year. Could > anyone > > help me with this problem? Thanks. > > > > DF > > year month day time flow > > 1972 1 1 1972-01-01 5 > > 1972 1 2 1972-01-02 5.5 > > 1972 1 3 1972-01-03 6 > > ... > > 1985 12 31 1985-12-31 6 > > > > > > for(i in 1972:1985){ > > if(DF$year==i & DF$month %in% 1:9){ > > DF$wyear <- i { > > }else{ > > DF$wyear < i-1 > > } > > } > > } > > > > [[alternative HTML version deleted]] > > > > ______________________________________________ > > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > > 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. >[[alternative HTML version deleted]]
Hardly. DF$wyear is a vector, but it is being treated as though it is a scalar. Read Bert's response. -- Sent from my phone. Please excuse my brevity. On July 4, 2017 11:17:24 AM PDT, Rui Barradas <ruipbarradas at sapo.pt> wrote:>Hello, > >You have a '{' too many. > >for(i in 1972:1985){ > if(DF$year==i & DF$month %in% 1:9){ > DF$wyear <- i > }else{ > DF$wyear < i-1 > } > } > } > >I believe this is it. > >Hope this helps, > >Rui Barradas > >Em 04-07-2017 19:31, lily li escreveu: >> Hi R users, >> I have a question about adding a column for water year. The dataframe >has >> the structure below. But the wyear column just shows one year. Could >anyone >> help me with this problem? Thanks. >> >> DF >> year month day time flow >> 1972 1 1 1972-01-01 5 >> 1972 1 2 1972-01-02 5.5 >> 1972 1 3 1972-01-03 6 >> ... >> 1985 12 31 1985-12-31 6 >> >> >> for(i in 1972:1985){ >> if(DF$year==i & DF$month %in% 1:9){ >> DF$wyear <- i { >> }else{ >> DF$wyear < i-1 >> } >> } >> } >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >> 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. >> > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >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.
Hi lily, It might be easier doing it like this: DF<-data.frame(year=rep(1972:1985,each=12), month=rep(1:12,14),day=rep(1,168)) DF$time<-paste(DF$year,DF$month,DF$day,sep="-") DF$flow<-runif(168,4,7) DF$wyear<-DF$year + (DF$month > 9) Jim On Wed, Jul 5, 2017 at 4:31 AM, lily li <chocold12 at gmail.com> wrote:> Hi R users, > I have a question about adding a column for water year. The dataframe has > the structure below. But the wyear column just shows one year. Could anyone > help me with this problem? Thanks. > > DF > year month day time flow > 1972 1 1 1972-01-01 5 > 1972 1 2 1972-01-02 5.5 > 1972 1 3 1972-01-03 6 > ... > 1985 12 31 1985-12-31 6 > > > for(i in 1972:1985){ > if(DF$year==i & DF$month %in% 1:9){ > DF$wyear <- i { > }else{ > DF$wyear < i-1 > } > } > } > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.