Search code examples
rfor-loopvectorcase

How to do a for loop with case_when


I'm a beginner with R and I'm trying to do a for-loop to recode many variables: when "test" modality is missing, then have "test.v1" modality. It looked very easy to do, but I can't get it:

VEC_1 <- c("test1","test2","test3","test4","test5","test6","test7","test8","test9")
VEC_2 <- c("test1.v1","test2.v1","test3.v1","test4.v1","test5.v1","test6.v1","test7.v1","test8.v1","test9.v1") 
 
for (i in 1:(min(length(VEC_1), length(VEC_2)))){
    df2 <- df1 %>%
        mutate(
          VEC_1[i] = case_when(
          is.na(VEC_1[i]) & !is.na(VEC_2[i]) ~ VEC_2[i],
          TRUE ~ VEC_1[i])
    )
}

I have this error

Unexpected error : '=' in:
"    mutate(
      VEC_1[i] ="

Does anyone have an idea ?

EDIT: df1 is like :

test1 <- c("A","B","A","A",NA,"B","A",NA,"A")
test1.v1 <- c("B",NA,"B","B","A","B","B",NA,"A") 
test2 <- c("B","B","B","B",NA,"C","C","C","C")
test2.v1 <- c("C",NA,"A","A","B","B","C",NA,"C") 
test3 <- c("A","B","B","B",NA,"C","C",NA,"C")
test3.v1 <- c("B","A","B",NA,"A","A","A","A",NA) 
test4 <- c(NA,"B","B","A",NA,"B","A",NA,"A")
test4.v1 <- c("B","B","B","A","A","B","B","B","B") 

df1 <- data.frame(test1,test1.v1,test2,test2.v1,test3,test3.v1,test4,test4.v1)

Solution

  • Based on the example data.frame df1, I'm wondering if you might try putting your data into long form, then grouping by row number and test, then substituting missing values.

    library(tidyverse)
    
    df1 %>%
      mutate(rn = row_number()) %>%
      pivot_longer(cols = -rn, names_to = c("test", "mode"), names_pattern = "test(\\d+)([.v1]*)") %>%
      group_by(rn, test) %>%
      mutate(value = ifelse(mode == "" & is.na(value), value[mode == ".v1"], value)) %>%
      pivot_wider(id_cols = rn, names_from = c(test, mode), values_from = value, names_prefix = "test", names_sep = "")
    

    Output

         rn test1 test1.v1 test2 test2.v1 test3 test3.v1 test4 test4.v1
      <int> <chr> <chr>    <chr> <chr>    <chr> <chr>    <chr> <chr>   
    1     1 A     B        B     C        A     B        B     B       
    2     2 B     NA       B     NA       B     A        B     B       
    3     3 A     B        B     A        B     B        B     B       
    4     4 A     B        B     A        B     NA       A     A       
    5     5 A     A        B     B        A     A        A     A       
    6     6 B     B        C     B        C     A        B     B       
    7     7 A     B        C     C        C     A        A     B       
    8     8 NA    NA       C     NA       A     A        B     B       
    9     9 A     A        C     C        C     NA       A     B