Можно ли динамически изменять столбцы (значения в столбце имеют другие имена столбцов) - PullRequest
2 голосов
/ 21 мая 2019

Итак, у меня есть один столбец информационного кадра, который содержит значение, равное другому имени столбца. Для каждой строки я хочу изменить значение столбца с именем.

df <- tibble(.rows = 6) %>% mutate(current_stage = c("Stage-1", "Stage-1", "Stage-2", "Stage-3", "Stage-4", "Stage-4"), `Stage-1` = c(1,1,1,2,4,5), `Stage-2` = c(40,50,20,10,15,10), `Stage-3` = c(1,2,3,4,5,6), `Stage-4` = c(NA, 1, NA, 2, NA, 3))

A tibble: 6 x 5
current_stage `Stage-1` `Stage-2` `Stage-3` `Stage-4`
<chr>             <dbl>     <dbl>     <dbl>     <dbl>
Stage-1               1        40         1        NA
Stage-1               1        50         2         1
Stage-2               1        20         3        NA
Stage-3               2        10         4         2
Stage-4               4        15         5        NA
Stage-4               5        10         6         3

Итак, в первой строке я бы хотел отредактировать значение в столбце Stage-1, поскольку в столбце current_stage указано Stage-1. Я пытался использовать !!rlang::sym:

df %>% mutate(!!rlang::sym(current_stage) := 15)

но я получаю ошибку: Error in is_symbol(x) : object 'current_stage' not found.

Это вообще возможно сделать? Или я должен просто прикусить пулю и написать другую функцию?

1 Ответ

4 голосов
/ 21 мая 2019

В пределах tidyverse, я думаю, использование длинного формата с gather - самый простой способ, предложенный Джеком Бруксом :

library(tidyverse)

df %>%
  rowid_to_column() %>%
  gather(stage, value, -current_stage, -rowid) %>%
  mutate(value = if_else(stage == current_stage, 15, value)) %>%
  spread(stage, value)
#> # A tibble: 6 x 6
#>   rowid current_stage `Stage-1` `Stage-2` `Stage-3` `Stage-4`
#>   <int> <chr>             <dbl>     <dbl>     <dbl>     <dbl>
#> 1     1 Stage-1              15        40         1        NA
#> 2     2 Stage-1              15        50         2         1
#> 3     3 Stage-2               1        15         3        NA
#> 4     4 Stage-3               2        10        15         2
#> 5     5 Stage-4               4        15         5        15
#> 6     6 Stage-4               5        10         6        15

Создано в 2019-05-20 с помощью пакета представительства (v0.2.1)

...