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.