[R] Conditions in R (Help Post)
Bert Gunter
bgunter@4567 @end|ng |rom gm@||@com
Tue Oct 22 20:59:36 CEST 2019
Both your syntax and semantics are wrong. This indicates to me that you
should spend more time with some basic R tutorials before proceeding.
That said, here are some of the errors:
1) You are not using sapply correctly. Moreover, no R level iteration is
needed anyway (sapply() iterates over columns in a data frame).
2) You are confusing && (not vectorized) with & (vectorized)
3) You seem to be confusing if ... else (flow control) with ifelse()
(vectorized function)
4) Many of your conditions are nonsense or redundant. For example:
(a<0 & b>0 & b<a) is nonsense
(a<0 & b>0 & b>a) is the same as (a < 0 & b > 0)
etc.
A simple way to accomplish what you want, I think, that takes advantage of
coercion of logicals to numeric
is something along the lines of this reproducible example:
set.seed(4444)
a <- floor(runif(50,-20,20)) ## D$X
b <- floor(runif(50,-20,20)) ## D$Y
D$phase <- rep_len(0, length(b)) +
1*(a<0 & b<0 & b<a) +
2*(a<0 & b<0 & b>a) +
8*(a<0 & b>0) ## etc.
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, Oct 22, 2019 at 11:30 AM jim holtman <jholtman using gmail.com> wrote:
> Had the condition for phase=2 incorrect:
>
> library(tidyverse)
> input <- read_delim(" YEAR DAY X Y Sig
> 1981 9 -0.213 1.08 1.10
> 1981 10 0.065 1.05 1.05", delim = ' ', trim_ws = TRUE)
>
> input <- mutate(input,
> phase = case_when(X < 0 & Y < 0 & Y < X ~ 'phase=1',
> X < 0 & Y < 0 & Y > X ~ 'phase=2',
> X < 0 & Y > 0 & Y < X ~ 'phase=7',
> X < 0 & Y > 0 & Y > X ~ 'phase=8',
> X > 0 & Y < 0 & Y < X ~ 'phase=3',
> X > 0 & Y < 0 & Y > X ~ 'phase=4',
> X > 0 & Y > 0 & Y > X ~ 'phase=6',
> X > 0 & Y > 0 & Y < X ~ 'phase=5',
> TRUE ~ 'unknown'
> )
> )
>
> Jim Holtman
> *Data Munger Guru*
>
>
> *What is the problem that you are trying to solve?Tell me what you want to
> do, not how you want to do it.*
>
>
> On Tue, Oct 22, 2019 at 11:20 AM jim holtman <jholtman using gmail.com> wrote:
>
> > Here is one way of doing it; I think the output you show is wrong:
> >
> > library(tidyverse)
> > input <- read_delim(" YEAR DAY X Y Sig
> > 1981 9 -0.213 1.08 1.10
> > 1981 10 0.065 1.05 1.05", delim = ' ', trim_ws = TRUE)
> >
> > input <- mutate(input,
> > phase = case_when(X < 0 & Y < 0 & Y < X ~ 'phase=1',
> > X < 0 & Y > 0 & Y < X ~ 'phase=2',
> > X < 0 & Y > 0 & Y < X ~ 'phase=7',
> > X < 0 & Y > 0 & Y > X ~ 'phase=8',
> > X > 0 & Y < 0 & Y < X ~ 'phase=3',
> > X > 0 & Y < 0 & Y > X ~ 'phase=4',
> > X > 0 & Y > 0 & Y > X ~ 'phase=6',
> > X > 0 & Y > 0 & Y < X ~ 'phase=5',
> > TRUE ~ 'unknown'
> > )
> > )
> >
> > > input
> > # A tibble: 2 x 6
> > YEAR DAY X Y Sig phase
> > <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
> > 1 1981 9 -0.213 1.08 1.1 phase=8
> > 2 1981 10 0.065 1.05 1.05 phase=6
> >
> > Jim Holtman
> > *Data Munger Guru*
> >
> >
> > *What is the problem that you are trying to solve?Tell me what you want
> to
> > do, not how you want to do it.*
> >
> >
> > On Tue, Oct 22, 2019 at 9:43 AM Yeasmin Alea <yeasmin.alea using gmail.com>
> > wrote:
> >
> >> Hello Team
> >> I would like to add a new column (for example-Phase) from the below data
> >> set based on the conditions
> >> YEAR DAY X Y Sig
> >> 1 1981 9 -0.213 1.08 1.10
> >> 2 1981 10 0.065 1.05 1.05
> >> *Conditions*
> >>
> >> D$Phase=sapply(D,function(a,b) {
> >> a <-D$X
> >> b<-D$Y
> >> if (a<0 && b<0 && b<a)
> >> {phase=1} else if (a<0 && b<0 && b>a)
> >> {phase=2} else if (a<0 && b>0 && b<a)
> >> {phase=7} else if (a<0 && b>0 && b>a)
> >> {phase=8} else if (a>0 && b<0 && b<a)
> >> {phase=3} else if (a>0 && b<0 && b>a)
> >> {phase=4} else if (a>0 && b>0 && b>a)
> >> {phase=6} else (a>0 && b>0 && b<a)
> >> {phase=5}
> >> })
> >>
> >> Can anyone help to fix the script to get a Phase column based on the
> >> conditions. The table will be like the below
> >> YEAR DAY X Y Sig Phase
> >> 1 1981 9 -0.213 1.08 1.10 phase=7
> >> 2 1981 10 0.065 1.05 1.05 phase=6
> >>
> >> Many thanks
> >> Alea
> >>
> >> [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help using 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 using 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]]
More information about the R-help
mailing list