Давайте рассмотрим пример.
library(sjmisc)
data(efc)
Из этого набора данных я хочу перекодировать все переменные, имя которых содержит cop
(чтобы я мог использовать tidyselect contains
) следующим образом. Для мужчин (e16sex==1
) NA
в 999
и else=copy
(как я мог бы сделать с sjmisc::rec(..., rec = "NA=999; else=copy"
); для самок (e16sex==2
) оставьте их нетронутыми.
Я пробовал через dplyr
(и sjmisc
) следующий наивный тест:
mutate_at(efc, vars(contains("cop")), list(~if_else(e16sex == 1, rec(., rec="NA=999; else=copy"),.)))
, но, как понятно, if_else
не обрабатывает вторую точку .
, как если бы это были исходные contains("cop")
-варианты для строк с e16sex != 1
.
Я ищу функцию (или составную), возвращающую данные кадр с указанной перекодировкой (поэтому, пожалуйста, избегайте for
). Я не мог попробовать с data.table
, потому что я еще не знаю язык, но все эффективные (и эффективные) решения приветствуются. Может быть, это можно сделать с помощью purrr
?
Спасибо!
ОБНОВЛЕНИЕ
Приведенный выше наивный тест работает. Я не пробовал это в этом примере, но с набором данных iris
и с переменной Species
вместо cop
переменных. Поскольку Species
является фактором, попытка изменить некоторые из его уровней на новый производит NA
, отсюда мое замешательство.