Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>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))
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading