medozem
medozem

Reputation: 15

Mutate with str_detect only if condition is true

Im trying to use str_detect to mutate only if the column "RedColor" is "1". I have a dataset test which looks like this:

#    id RedColor Color_Number
#1   1  1        1
#2   2  0        1
#3   3  1        3
#4   4  1        2  
#5   6  0        2
#6   8  1        6

I tried the filter function but it returns me only a filtered dataset with all other cases with RedColor = "0" removed.

test <- test %>%
  filter(RedColor==TRUE) %>%
  mutate(DarkRed = str_detect(Color_Number, "1|2"))

Im expecting an output with the new column DarkRed = "1" in all cases with RedColor = 1 and 1 or 2 in column Color_Number.

#    id   RedColor Color_Number Dark_Red
#1   1    1        1            1
#2   2    0        1            0
#3   3    1        3            0
#4   4    1        2            1
#5   6    0        2            0
#6   8    1        6            0

Thank you!

Upvotes: 1

Views: 789

Answers (4)

TarJae
TarJae

Reputation: 78917

Update on OP's request (see comments):

With this dataframe:

  id RedColor Color_Number
1  1        1          one
2  2        0          one
3  3        1        three
4  4        1          two
5  6        0          two
6  8        1          six

you could use this code:

library(dplyr)
df %>% 
    mutate(Dark_Red = ifelse(
        RedColor == 1 & Color_Number == "one" | Color_Number == "two", 1, 0))

Output:

  id RedColor Color_Number Dark_Red
1  1        1          one        1
2  2        0          one        0
3  3        1        three        0
4  4        1          two        1
5  6        0          two        1
6  8        1          six        0

First answer:

We could use ifelse

str_detect is not appropriate as Ronak already explained:

library(dplyr)
df %>% 
  mutate(Dark_Red = ifelse(
    RedColor == 1 & Color_Number == 1 | Color_Number == 2, 1, 0))

Output:

  id RedColor Color_Number Dark_Red
1  1        1            1        1
2  2        0            1        0
3  3        1            3        0
4  4        1            2        1
5  6        0            2        1
6  8        1            6        0

Upvotes: 2

akrun
akrun

Reputation: 887038

Using base R

transform(df, Dark_Red = +(RedColor == 1& Color_Number %in% 1:2))
  id RedColor Color_Number Dark_Red
1  1        1            1        1
2  2        0            1        0
3  3        1            3        0
4  4        1            2        1
5  6        0            2        0
6  8        1            6        0

data

df <- structure(list(id = c(1L, 2L, 3L, 4L, 6L, 8L), RedColor = c(1L, 
0L, 1L, 1L, 0L, 1L), Color_Number = c(1L, 1L, 3L, 2L, 2L, 6L)), row.names = c(NA, 
-6L), class = "data.frame")

Upvotes: 2

user12256545
user12256545

Reputation: 3002

you can use ifelse inside the mutate call instead of filtering:

test <- test %>%
  mutate(Darkred=ifelse((RedColor==TRUE & Color_Number %in% 1:2), 1,0))


> test
# A tibble: 10 × 4
      id RedColor Color_Number Darkred
   <int>    <int>        <int>   <dbl>
 1     1        1            2       1
 2     2        1            2       1
 3     3        1            3       0
 4     4        1            3       0
 5     5        0            4       0
 6     6        0            2       0
 7     7        1            3       0
 8     8        1            4       0
 9     9        0            5       0
10    10        0            3       0

Data:

test<-data_frame(id=1:10,
RedColor=rbinom(10,1,0.5),
Color_Number=sample(1:5,10,TRUE,rep(.2,5)))


Upvotes: 0

Ronak Shah
Ronak Shah

Reputation: 388862

For exact matches don't perform regex match. str_detect is used for pattern matching. Use %in% to match multiple values.

library(dplyr)

df <- df %>% mutate(Dark_Red = as.integer(RedColor == 1 & Color_Number %in% 1:2))
df

#  id RedColor Color_Number Dark_Red
#1  1        1            1        1
#2  2        0            1        0
#3  3        1            3        0
#4  4        1            2        1
#5  6        0            2        0
#6  8        1            6        0

If you want to write this in base R use transform -

df <- transform(df, Dark_Red = as.integer(RedColor == 1 & Color_Number %in% 1:2))

data

df <- structure(list(id = c(1L, 2L, 3L, 4L, 6L, 8L), RedColor = c(1L, 
0L, 1L, 1L, 0L, 1L), Color_Number = c(1L, 1L, 3L, 2L, 2L, 6L)), 
row.names = c(NA, -6L), class = "data.frame")

Upvotes: 1

Related Questions