abduljelil
abduljelil

Reputation: 45

mutate on condition

I have a data set like this:

dt <- tibble(
TRIAL = c("M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1"),
  PLOT= c(1, 2, 3, 1, 6, 3, 2, 3, 1,67,34),
  trait = c("ASI", "ASI", "ASI", "ASI", "ASI", "CUR", "CUR", "CUR", "CUR", "CUR", "CUR"),
  trialValue = c(2, 2, 2, 2, 2, , , , , ,)
)

# # A tibble: 11 x 4
 #      TRIAL     PLOT  trait           trialValue
        <chr>     <dbl> <chr>             <dbl 
  #1   M20-01RND1   1    ASI                2
  #2   M20-01RND1   2    ASI                2
  #3   M20-01RND1   3    ASI                2
  #4   M20-01RND1   1    ASI                2
  #5   M20-01RND1   6    ASI
  #6   M20-01RND1   3    CUR
  #7   M20-01RND1   2    CUR
  #8   M20-01RND1   3    CUR
  #9   M20-01RND1   1    CUR
  #10 M20-01RND1    67   CUR
  #11 M20-01RND1    34   CUR

This is what I want to achieve:I want a new column data_qc_code to be mutated if the required conditions are met. i.e trait = "ASI" & traitValue = 2 give "A", and when traitValue is empty then give "M"

# # A tibble: 11 x 4
 #     TRIAL      PLOT  trait    trialValue  data_qc_code
       <chr>      <dbl> <chr>       <dbl         <chr>
 #1   M20-01RND1    1    ASI          2            Q
 #2   M20-01RND1    2    ASI          2            Q
 #3   M20-01RND1    3    ASI          2            Q
 #4   M20-01RND1    1    ASI          2            Q
 #5   M20-01RND1    6    ASI                       M
 #6   M20-01RND1    3    CUR                       M
 #7   M20-01RND1    2    CUR                       M
 #8   M20-01RND1    3    CUR                       M
 #9   M20-01RND1    1    CUR                       M
 #10 M20-01RND1 67   CUR                           M
 #11 M20-01RND1 34   CUR                           M

When I run this code I get not the expected output

df %>%
  mutate(data_qc_code = case_when(
           trait == "ASI" & traitValue == 2 ~ "A",
              traitValue == ""  ~ "M"))->df1

This was my output

# # A tibble: 11 x 4
#     TRIAL       PLOT   trait    trialValue    data_qc_code
     <chr>        <dbl>  <chr>      <dbl             <chr>
  #1   M20-01RND1   1    ASI         2                 Q
  #2   M20-01RND1   2    ASI         2                 Q
  #3   M20-01RND1   3    ASI         2                 Q
  #4   M20-01RND1   1    ASI         2                 Q
  #5   M20-01RND1   6    ASI                                                    
  #6   M20-01RND1   3    CUR                                                  
  #7   M20-01RND1   2    CUR                                                  
  #8   M20-01RND1   3    CUR                                                  
  #9   M20-01RND1   1    CUR                                                  
  #10 M20-01RND1    67   CUR                                                  
  #11 M20-01RND1    34   CUR                                                  

Kindly help out please. Thank you.

Upvotes: 0

Views: 38

Answers (1)

benson23
benson23

Reputation: 19097

Note that in R, missing value is represented by NA. Therefore I changed your input a little bit to avoid errors and to include NA.

Note that in your question, you said you want to fill the first criteria with "A", but in your codes, it's "Q". Therefore I also used "Q" in my code.

library(tidyverse)

dt <- tibble(
  TRIAL = c("M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1", "M20-01RND1"),
  PLOT= c(1, 2, 3, 1, 6, 3, 2, 3, 1,67,34),
  trait = c("ASI", "ASI", "ASI", "ASI", "ASI", "CUR", "CUR", "CUR", "CUR", "CUR", "CUR"),
  trialValue = c(2, 2, 2, 2, 2, NA, NA, NA, NA, NA, NA)
)

dt %>% mutate(data_qc_code = ifelse(trait == "ASI" & trialValue == 2, "Q", "M"))

Output

# A tibble: 11 x 5
   TRIAL       PLOT trait trialValue data_qc_code
   <chr>      <dbl> <chr>      <dbl> <chr>       
 1 M20-01RND1     1 ASI            2 Q           
 2 M20-01RND1     2 ASI            2 Q           
 3 M20-01RND1     3 ASI            2 Q           
 4 M20-01RND1     1 ASI            2 Q           
 5 M20-01RND1     6 ASI            2 Q           
 6 M20-01RND1     3 CUR           NA M           
 7 M20-01RND1     2 CUR           NA M           
 8 M20-01RND1     3 CUR           NA M           
 9 M20-01RND1     1 CUR           NA M           
10 M20-01RND1    67 CUR           NA M           
11 M20-01RND1    34 CUR           NA M        

Upvotes: 1

Related Questions