Reputation: 272
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
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