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

Changing values in multiple column given one condition (preferably in dplyr)

I’m looking for an easy way to change several values for the same person. Preferably with dplyr or any other package from tidyverse.

Here my example:

df <- data.frame(personid = 1:3, class = c("class1", "class3", "class3"), classlevel = c(1, 11, 3), education = c("BA", "Msc", "BA"))
df

My dataset contains an entry with several mistakes. Person #2 should be part of class 1, at classlevel 1 und his education is BA, not MSc. I use mutate with case_when a lot, but in my case I don’t want to change one variable with multiple condition, I have one condition and want to change multiple values in other variables based on this condition.

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

Basically, I’m looking for an shorter code which replaces this:

df$class[df$personid == 2] <- "class1"
df$classlevel[df$personid == 2] <- 1
df$education[df$personid == 2] <- "BA"
df

or this:

library(tidyverse)
df <- df |> 
   mutate(class = case_when(personid == 2 ~ "class1", TRUE ~ class)) |> 
   mutate(classlevel = case_when(personid == 2 ~ 1, TRUE ~ as.numeric(classlevel))) |> 
   mutate(education = case_when(personid == 2 ~ "BA", TRUE ~ education))
df

In my original data, there are several dozend cases like this, and I find it a bit tedious to use three lines of code for each person. Is there a shorter way?

Thanks for your input!

>Solution :

One way would be to create a data frame of the values to be updated and use rows_update(). Note that this assumes the rows are uniquely identified.

library(dplyr)

df_update <- tribble(
  ~personid, ~class, ~classlevel, ~education,
  1,   "class1", 1, "BA"
  )  

df %>%
  rows_update(df_update, by = "personid")

  personid  class classlevel education
1        1 class1          1        BA
2        2 class1          1        BA
3        3 class3          3        BA
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