# Conditions in R (Help Post)

8 messages
Open this post in threaded view
|

## Conditions in R (Help Post)

 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 && ba)     {phase=2} else if (a<0 && b>0 && b0 && b>a)     {phase=8} else if (a>0 && b<0 && b0 && b<0 && b>a)     {phase=4} else if (a>0 && b>0 && b>a)     {phase=6} else (a>0 && b>0 && b
Open this post in threaded view
|

## Re: Conditions in R (Help Post)

 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     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 <[hidden email]> 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     {phase=1} else if (a<0 && b<0 && b>a) >     {phase=2} else if (a<0 && b>0 && b     {phase=7} else if (a<0 && b>0 && b>a) >     {phase=8} else if (a>0 && b<0 && b     {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     {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]] > > ______________________________________________ > [hidden email] 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]] ______________________________________________ [hidden email] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: Conditions in R (Help Post)

 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 <[hidden email]> 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 >     > 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 <[hidden email]> > 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>     {phase=1} else if (a<0 && b<0 && b>a) >>     {phase=2} else if (a<0 && b>0 && b>     {phase=7} else if (a<0 && b>0 && b>a) >>     {phase=8} else if (a>0 && b<0 && b>     {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>     {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]] >> >> ______________________________________________ >> [hidden email] 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]] ______________________________________________ [hidden email] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: Conditions in R (Help Post)

 Here is another way of doing it by computing the index based on the conditions > 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     1  1981     9 -0.213  1.08  1.1  phase=8 2  1981    10  0.065  1.05  1.05 phase=6 > > # another way of doing it by constructing an integer to be used as > # index for the phase value based on the evaluation of X<0, Y<0 and Y > index <- with(input, +               (X < 0) * 4 + (Y < 0) * 2 + (Y < X) + ) > > phase_val <- c(6, 5, 4, 3, 8, 7, 2, 1) > > input\$phase_2 <- paste0('phase=', phase_val[index + 1L]) > input # A tibble: 2 x 7    YEAR   DAY      X     Y   Sig phase   phase_2       1  1981     9 -0.213  1.08  1.1  phase=8 phase=8 2  1981    10  0.065  1.05  1.05 phase=6 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 11:28 AM jim holtman <[hidden email]> 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 <[hidden email]> 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 >>     >> 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 <[hidden email]> >> 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>>     {phase=1} else if (a<0 && b<0 && b>a) >>>     {phase=2} else if (a<0 && b>0 && b>>     {phase=7} else if (a<0 && b>0 && b>a) >>>     {phase=8} else if (a>0 && b<0 && b>>     {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>>     {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]] >>> >>> ______________________________________________ >>> [hidden email] 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]] ______________________________________________ [hidden email] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|

## Re: Conditions in R (Help Post)

Open this post in threaded view
|

## Re: Conditions in R (Help Post)

 In reply to this post by Yeasmin Alea Hi Yeasmin, I suspect that you didn't intend to have conditions like: a<0 && b>0 && b 0 && abs(b) < abs(a) If this is the case, the following function seems to return the values of phase that you want: assign_phase<-function(x,y) {  phase<-c(1,2,7,8,3,4,6,5)  phase_index<-4 * (x > 0) + 2 * (y > 0) + (abs(x) < abs(y))  return(phase[phase_index+1]) } Jim On Wed, Oct 23, 2019 at 3:43 AM Yeasmin Alea <[hidden email]> 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     {phase=1} else if (a<0 && b<0 && b>a) >     {phase=2} else if (a<0 && b>0 && b     {phase=7} else if (a<0 && b>0 && b>a) >     {phase=8} else if (a>0 && b<0 && b     {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     {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]] > > ______________________________________________ > [hidden email] 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. ______________________________________________ [hidden email] mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.