[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