[R] Conditions in R (Help Post)

jim holtman jho|tm@n @end|ng |rom gm@||@com
Tue Oct 22 20:42:17 CEST 2019


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
  <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
>
> # 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<X.
>
> 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
  <dbl> <dbl>  <dbl> <dbl> <dbl> <chr>   <chr>
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 <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]]



More information about the R-help mailing list