Replace Na based on condition

id var1 var2 var3 var4
1  3     5    NA    10
2  0     NA    7   NA
3  1      3    NA   6 
4  0     NA   NA    6

Hello I have this example as a data set. I am trying to replace the na based on the condition that if var1 =0 then replace all nas of the row as 0, but not the other na of the other rows.
I have tried the following

mydf <- replace(mydf, is.na(mydf), 0)

but as you understand this replaces all na values
I want to replace all nas of the row based on my condition not just for one column.
Could you provide me with some help please? Thank you

>Solution :

We may create a condition with the var1 column as well to only consider those rows where ‘var1’ is 0

i1 <- is.na(mydf[-c(1, 2)])
i2 <- (mydf$var1 == 0)[row(mydf[-c(1,2)])]
mydf[-c(1,2)][i1 & i2] <- 0

-output

> mydf
  id var1 var2 var3 var4
1  1    3    5   NA   10
2  2    0    0    7    0
3  3    1    3   NA    6
4  4    0    0    0    6

Or instead of subsetting the data, it can be applied to the whole data as well

replace(mydf, is.na(mydf) & mydf$var1 == 0, 0)
  id var1 var2 var3 var4
1  1    3    5   NA   10
2  2    0    0    7    0
3  3    1    3   NA    6
4  4    0    0    0    6

Or using dplyr

library(dplyr)
mydf %>% 
   mutate(across(var2:var4, ~ replace(.x, is.na(.x) & var1 == 0, 0)))

-output

  id var1 var2 var3 var4
1  1    3    5   NA   10
2  2    0    0    7    0
3  3    1    3   NA    6
4  4    0    0    0    6

data

mydf <- structure(list(id = 1:4, var1 = c(3L, 0L, 1L, 0L), var2 = c(5L, 
NA, 3L, NA), var3 = c(NA, 7L, NA, NA), var4 = c(10L, NA, 6L, 
6L)), class = "data.frame", row.names = c(NA, -4L))

Leave a Reply