Data Conversion

Hi,
I have a dataset as below (Current data:), and I would like to change few things to the data set (Expected output after conversion:) using Rstudio.

If last 3 columns are 0 0 0, then it should be changed to NA NA NA. But not when any one of the is 1.

Can someone help me? Thanks in advance.

BR,
Anban

Current data:
Sl.No. A1 A2 A3 A4 A5
1 1 0 1 0 1
2 1 1 0 0 0
3 0 0 1 0 0
4 1 1 0 0 1
5 0 1 0 0 0
6 1 0 0 0 0
7 0 0 1 1 1
.
N 1 1 0 1 1

Expected output after conversion:
Sl.No. A1 A2 A3 A4 A5
1 1 0 1 0 1
2 1 1 NA NA NA
3 0 0 1 0 0
4 1 1 0 0 1
5 0 1 NA NA NA
6 1 0 NA NA NA
7 0 0 1 1 1
.
N 1 1 0 1 1

suppressPackageStartupMessages({library(dplyr)})
dat <- structure(list(Sl.No. = c("1", "2", "3", "4", "5", "6", "7", 
"N"), A1 = c(1, 1, 0, 1, 0, 1, 0, 1), A2 = c(0, 1, 0, 1, 1, 0, 
0, 1), A3 = c(1, 0, 1, 0, 0, 0, 1, 0), A4 = c(0, 0, 0, 0, 0, 
0, 1, 1), A5 = c(1, 0, 0, 1, 0, 0, 1, 1)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -8L), spec = structure(list(
    cols = list(Sl.No. = structure(list(), class = c("collector_character", 
    "collector")), A1 = structure(list(), class = c("collector_double", 
    "collector")), A2 = structure(list(), class = c("collector_double", 
    "collector")), A3 = structure(list(), class = c("collector_double", 
    "collector")), A4 = structure(list(), class = c("collector_double", 
    "collector")), A5 = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

dat 
#> # A tibble: 8 x 6
#>   Sl.No.    A1    A2    A3    A4    A5
#>   <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1          1     0     1     0     1
#> 2 2          1     1     0     0     0
#> 3 3          0     0     1     0     0
#> 4 4          1     1     0     0     1
#> 5 5          0     1     0     0     0
#> 6 6          1     0     0     0     0
#> 7 7          0     0     1     1     1
#> 8 N          1     1     0     1     1

dat %>% 
  mutate(A3 = ifelse(A3+A4+A5 == 0,NA,A3)) %>%
  mutate(A4 = ifelse(A3+A4+A5 == 0,NA,A4)) %>%
  mutate(A5 = ifelse(A3+A4+A5 == 0,NA,A5))
#> # A tibble: 8 x 6
#>   Sl.No.    A1    A2    A3    A4    A5
#>   <chr>  <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1          1     0     1     0     1
#> 2 2          1     1    NA    NA    NA
#> 3 3          0     0     1     0     0
#> 4 4          1     1     0     0     1
#> 5 5          0     1    NA    NA    NA
#> 6 6          1     0    NA    NA    NA
#> 7 7          0     0     1     1     1
#> 8 N          1     1     0     1     1

Created on 2020-09-24 by the reprex package (v0.3.0.9001)

1 Like

Adding one more solution:

sample_data <- read.table(text = "Sl.No. A1 A2 A3 A4 A5
1 1 0 1 0 1
2 1 1 0 0 0
3 0 0 1 0 0
4 1 1 0 0 1
5 0 1 0 0 0
6 1 0 0 0 0
7 0 0 1 1 1",
                          header = TRUE)

conversion_function <- function(row_vector)
{
    if (isTRUE(x = all(row_vector[4:6] == 0)))
        row_vector[4:6] <- NA
    
    row_vector
}

library(magrittr)

sample_data %>%
    split(f = seq_len(length.out = nrow(x = sample_data))) %>%
    lapply(FUN = conversion_function) %>%
    do.call(what = rbind.data.frame,
            args = .)
#>   Sl.No. A1 A2 A3 A4 A5
#> 1      1  1  0  1  0  1
#> 2      2  1  1 NA NA NA
#> 3      3  0  0  1  0  0
#> 4      4  1  1  0  0  1
#> 5      5  0  1 NA NA NA
#> 6      6  1  0 NA NA NA
#> 7      7  0  0  1  1  1

Created on 2020-09-24 by the reprex package (v0.3.0)

1 Like

Thank you very much it works!

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.