BPL
BPL

Reputation: 137

Conditionally replace NAs in Certain Columns Based on Row Values

For a dataframe like I have below, I am trying to selectively replace the NAs in columns a, b, and c with a 0 using R, but only when there is at least one missing value in those columns for that row.

For example, I would want to replace the NAs in rows 1,2, and 5, but leave row 4 alone, and not replace the NA in column d

sample data

 df <- data.frame(a = c(1,NA,2,NA,3,4), 
                  b = c(NA,5,6,NA,7,8), 
                  c = c(9,NA,10,NA,NA,11),
                  d = c("Alpha","Beta","Charlie","Delta",NA,"Foxtrot"))

> df
   a  b  c       d
1  1 NA  9   Alpha
2 NA  5 NA    Beta
3  2  6 10 Charlie
4 NA NA NA   Delta
5  3  7 NA    <NA>
6  4  8 11 Foxtrot

Desired outcome

> df_naReplaced
   a  b  c       d
1  1  0  9   Alpha
2  0  5  0    Beta
3  2  6 10 Charlie
4 NA NA NA   Delta
5  3  7  0    <NA>
6  4  8 11 Foxtrot

The solutions that I have found so far only work on conditions by column, but not by row, or would require actively removing those columns from their context (in this example separating it from d).

I have tried using ifelse and an if statement like below but was unable to get it to work as selectively as I would like, as it replaces all NA in that column.

if(df %>% select(a:c) %>% any(!is.na(.))){
  df<- df %>% replace_na(list(a= 0,
                              b= 0,
                              c= 0)
)
}

Thank you for whatever help you are able to offer!

Upvotes: 2

Views: 201

Answers (1)

Jilber Urbina
Jilber Urbina

Reputation: 61154

Here's an R base solution

> df[,-4][(is.na(df[, -4]) & rowSums(is.na(df[, -4])) < 3)] <- 0
> df
   a  b  c       d
1  1  0  9   Alpha
2  0  5  0    Beta
3  2  6 10 Charlie
4 NA NA NA   Delta
5  3  7  0    <NA>
6  4  8 11 Foxtrot

Upvotes: 2

Related Questions