Home > Software design >  Setting values to NA in one column based on conditions in another column
Setting values to NA in one column based on conditions in another column

Time:05-28

Here's a simplified mock dataframe:

df1 <- data.frame(amb = c(2.5,3.6,2.1,2.8,3.4,3.2,1.3,2.5,3.2),
                  warm = c(3.6,5.3,2.1,6.3,2.5,2.1,2.4,6.2,1.5),
                  sensor = c(1,1,1,2,2,2,3,3,3))

I'd like to set all values in the "amb" column to NA if they're in sensor 1, but retain the values in the "warm" column for sensor 1. Here's what I'd like the final output to look like:

amb  warm  sensor
NA   3.6   1
NA   5.3   1
NA   2.1   1
2.8  6.3   2
3.4  2.5   2
3.2  2.1   2
1.3  2.4   3
2.5  6.2   3
3.2  1.5   3

Using R version 4.0.2, Mac OS X 10.13.6

CodePudding user response:

A possible solution, based on dplyr:

library(dplyr)

df1 %>% 
  mutate(amb = ifelse(sensor == 1, NA, amb))

#>   amb warm sensor
#> 1  NA  3.6      1
#> 2  NA  5.3      1
#> 3  NA  2.1      1
#> 4 2.8  6.3      2
#> 5 3.4  2.5      2
#> 6 3.2  2.1      2
#> 7 1.3  2.4      3
#> 8 2.5  6.2      3
#> 9 3.2  1.5      3

CodePudding user response:

Seems to be best handled with the vectorized function is.na<-

is.na(df1$amb) <- df1$sensor %in% c(1)  # that c() isn't needed

But to be most general and support tests of proper test for equality among floating point numbers the answer might be:

is.na(df1$amb) <- df1$sensor-1 < 1e-16
  •  Tags:  
  • r
  • Related