Как перекодировать несколько переменных одновременно с опцией else = copy в зависимости от условия других переменных в R? - PullRequest
0 голосов
/ 24 февраля 2020

Давайте рассмотрим пример.

library(sjmisc)
data(efc)

Из этого набора данных я хочу перекодировать все переменные, имя которых содержит cop (чтобы я мог использовать tidyselect contains) следующим образом. Для мужчин (e16sex==1) NA в 999 и else=copy (как я мог бы сделать с sjmisc::rec(..., rec = "NA=999; else=copy"); для самок (e16sex==2) оставьте их нетронутыми.

Я пробовал через dplyrsjmisc) следующий наивный тест:

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, отсюда мое замешательство.

1 Ответ

0 голосов
/ 24 февраля 2020

Я не уверен, что полностью понимаю вопрос, но вы могли бы использовать для l oop для этого:

for(x in grep( "cop",names(efc))) { 
   efc[!is.na(efc$e16sex) & efc$e16sex==1 & is.na(efc[,x]),x] <- 999 
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...