'Modify a single cell value in dplyr
Let's say I have the following dataset:
dat <- read.table(text="id_1 id_2 
                  123 NA
                  456 NA
                  NA 3
                  NA 1
                  NA 1", header=T)
I'd like to change the id_1 value for the first row.  I'd like to do something like this: 
dat %>% slice(1) %>% mutate(id_1 == "new_id") %>% unslice()
However there doesn't appear to be an unslice command, so I'm left with a dataframe that has a single row (the modified).  Is there a clean way do get back the original dataset after modification in-place?
Solution 1:[1]
If I understand your question correctly and you just want to change the value in the column id_1 (rather than changing the column name), you can access the row with the row_number command.
dat %>% 
    mutate(id_1 = ifelse(row_number() == 1, "new_id",id_1))
If you want to do this with further rows as well, consider:
dat %>% 
    mutate(id_1 = case_when(row_number() == 1 ~"new_id1", 
                            row_number() == 2 ~"new_id2",
                            TRUE ~ id_1))
etc.
Note that this will of course change the column type to a character type. If you don't want to access the row by it's number, you can also do this via the exact value that you want to change.
dat %>% 
      mutate(id_1 = ifelse(id_1 == 456, "new_id",id_1))
Solution 2:[2]
You could use mutate_at with replace to do that.
library(dplyr)
dat %>%
  mutate_at(vars(id_1), function(x) replace(x, 
                      row_number(x) == 1, 
                      "new_id"))
# id_1 id_2
# 1 new_id   NA
# 2    456   NA
# 3   <NA>    3
# 4   <NA>    1
# 5   <NA>    1
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | |
| Solution 2 | Jonathan V. Solórzano | 
