Home > Software engineering >  Replacing values in a data frames based on condition
Replacing values in a data frames based on condition

Time:06-12

I want to convert values 0<x<9 & x<50.2 to NA.My data frame has the first five columns which do not have to have replaced, I only want to replace values in column 6 to column 60. I have tried to it in 2 steps as follows but, it also replaced values I dont intend to change

BdsDf[BdsDf > 50.2][6:60] <- NA; BdsDf[BdsDf < 9][6:60] <- NA

CodePudding user response:

Here is one way:

# test data
df = data.frame(lapply(1:60, function(x) {
  rnorm(100, 50, 25)
}))


df[,6:60][0 < df[,6:60] & df[,6:60] < 9 & df[,6:60] < 50.2] = NA

CodePudding user response:

With naniar, you can use replace_with_na_at to select the specific columns and add the 2 conditions.

library(dplyr)
library(naniar)

BdsDf %>%
  replace_with_na_at(.vars = -1:5,
                     condition = ~ .x < 9 | .x > 50.2)

Output

   X1 X2 X3 X4 X5 X6 X7 X8
1  75 86 91 16  6 NA NA NA
2  84 68  8 85 19 NA 38 NA
3  18 52  5 17 59 NA 28 NA
4  97 86 45 17 31 NA NA 28
5  41 95 60 80 49 NA 24 NA
6  47 56 65 35 44 18 NA 19
7  29 46  3 22 36 15 NA 10
8  48 50 60 38 47 NA NA 35
9  91 20 50  5 24 40 47 19
10 85 84 15 71 96 NA NA 26

Data

BdsDf <- structure(list(X1 = c(75L, 84L, 18L, 97L, 41L, 47L, 29L, 48L, 
91L, 85L), X2 = c(86L, 68L, 52L, 86L, 95L, 56L, 46L, 50L, 20L, 
84L), X3 = c(91L, 8L, 5L, 45L, 60L, 65L, 3L, 60L, 50L, 15L), 
    X4 = c(16L, 85L, 17L, 17L, 80L, 35L, 22L, 38L, 5L, 71L), 
    X5 = c(6L, 19L, 59L, 31L, 49L, 44L, 36L, 47L, 24L, 96L), 
    X6 = c(66L, 0L, 84L, 3L, 84L, 18L, 15L, 60L, 40L, 67L), X7 = c(73L, 
    38L, 28L, 6L, 24L, 91L, 79L, 7L, 47L, 88L), X8 = c(92L, 57L, 
    66L, 28L, 85L, 19L, 10L, 35L, 19L, 26L)), class = "data.frame", row.names = c(NA, 
-10L))
  • Related