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 according to column name in r

I would like to replace according to the column name, according to another dataframe

I have this dataframe:

name<-c("luis", "John", "Leo")
"2022-08-01"<-c(NA,"yes","yes")
"2022-08-02"<-c("yes",NA,"yes")
"2022-08-03"<-c(NA,"yes",NA)
df<-data_frame(name,`2022-08-01`,`2022-08-02`,`2022-08-03`)

what does it look like:

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

  name  `2022-08-01` `2022-08-02` `2022-08-03`
  <chr> <chr>        <chr>        <chr>       
1 luis  NA           yes          NA          
2 John  yes          NA           yes         
3 Leo   yes          yes          NA 

and this other

date<-c("2022-08-01", "2022-08-02", "2022-08-03")
value<-c("a,b","a,c","d")
df2<-data_frame(date, value)

what does it look like:

  date       value
  <chr>      <chr>
1 2022-08-01 a,b  
2 2022-08-02 a,c  
3 2022-08-03 d

I want that according to the second dataframe it is replaced in the first dataframe, according to the date and only the rows that say yes. So that I get a result like the following:

    name    01/08/22    02/08/22    03/08/22
1   luis    NA             a,c        NA
2   John    a,b            NA         d
3   Leo     a,b            a,c        NA

>Solution :

A dplyr way:

library(dplyr)

df <- 
  df |> 
  mutate(across(-name,
                ~ if_else(is.na(.), NA_character_, df2$value[date == cur_column()])))

Or base:


df[,-1] <- lapply(seq_along(df[,-1]),
                  \(x) ifelse(is.na(df[,-1][[x]]), NA_character_, df2$value[date == names(df[,-1])[x]]))

Output:

# A tibble: 3 × 4
  name  `2022-08-01` `2022-08-02` `2022-08-03`
  <chr> <chr>        <chr>        <chr>       
1 luis  NA           a,c          NA          
2 John  a,b          NA           d           
3 Leo   a,b          a,c          NA          
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