A. Piong
A. Piong

Reputation: 272

Changing multiple column values at once for a single row in my dataframe

Here is an example of my data

df <- data.frame(ID = c("A", "B", "C", "D", "E", "F"),
                 State = c("StateA", "StateA", NA, "StateB", "StateC", "StateC"),
                 Town = c("Town1", "Town2", NA, "Town4", "Town5", "Town6"),
                 Street = c("StreetX", "StreetY", NA, "StreetQ", "StreetK", "StreetN"))

Is there a tidy way to enter the missing data for the row where ID == "C"? e.g. State == "StateB", Town == "Town3", and Street == "StreetZ", for ID == "C" If I had to change values for more observations, I would use some combination of mutate() and case_when(), or mutate_at() as such:

df %>%
   mutate(State = ifelse(ID == "C", "StateB", State),
          Town = ifelse(ID == "C", "Town3", Town),
          Street = ifelse(ID == "C", "StreetZ", Street))

But this just seems so cumbersome and repetitive for just one record. I tried this:

df %>% 
   mutate_at(vars(c("State", "Town", "Street")), ~ifelse(ID == "C", c("StateB", "Town3", "StreetZ"), .)

which obviously didn't work or else I wouldn't be here asking how to do it! Or maybe some key/value method might work?

c("State" = "StateB", "Town" = "Town3", "Street" = "StreetZ")

Thanks in advance!

Upvotes: 1

Views: 445

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388807

You can use the new rows_update function written for such tasks.

library(dplyr)

row <- tibble(ID = 'C', State = 'StateB', Town = 'Town3', Street = 'StreetZ')
result <- rows_update(df, row, by = 'ID')

#  ID  State  Town  Street
#1  A StateA Town1 StreetX
#2  B StateA Town2 StreetY
#3  C StateB Town3 StreetZ
#4  D StateB Town4 StreetQ
#5  E StateC Town5 StreetK
#6  F StateC Town6 StreetN

Upvotes: 1

Related Questions