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.4...@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 <chocol...@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@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]] ______________________________________________ R-help@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.