Заменить значения в нескольких переменных в R - PullRequest
1 голос
/ 05 марта 2020

У меня есть датафрейм с 82 переменными. Многие из переменных содержат буквы алфавита c, которые я хочу изменить на набор чисел. Я могу сделать это столбец за столбцом, номер за номером, используя следующий код:

 library(tibble)
 mydf <- tribble(~Var1, ~Var2.a, ~Var3.a, ~Var4.a,
            "A", "b", "b", "d",
            "B", "w", NA, "w",
            "C", "g", "k", "b",
            "D", "k", NA, "j")

 newdf <- mydf %>%
   mutate(Var2.a = ifelse(Var2.a %in% c("m", "p", "w", "h", "n"), 1, Var2.a),           
          Var2.a = ifelse(Var2.a %in% c("k", "b", "g", "j", "f", "d"), 2, Var2.a),
          Var3.a = ifelse(Var3.a %in% c("m", "p", "w", "h", "n"), 1, Var3.a),           
          Var3.a = ifelse(Var3.a %in% c("k", "b", "g", "j", "f", "d"), 2, Var3.a),
          Var4.a = ifelse(Var4.a %in% c("m", "p", "w", "h", "n"), 1, Var4.a),           
          Var4.a = ifelse(Var4.a %in% c("k", "b", "g", "j", "f", "d"), 2, Var4.a))

Но для 70+ столбцов, которые мне нужно изменить, это займет много времени!

Все интересующие переменные имеют совпадающую буквенную комбинацию в имени переменной (".a" в данных примера), поэтому я должен иметь возможность использовать оператор ifelse для этих столбцов, используя contains() , Однако я не могу понять, как это сделать!

Я посмотрел на этот ответ , который, как мне кажется, приближает меня, но я не могу понять, как встроить оператор if в него:

 newdf <- mydf %>%
   mutate_at(vars[2:4] = ifelse(vars %in% c("m", "p", "w", "h", "n"), 1, vars)

Но я получаю ошибку Error in vars[2:4] : object of type 'closure' is not subsettable. Я думаю, что здесь неправильные скобки, и, вероятно, также использование vars!

1 Ответ

4 голосов
/ 05 марта 2020

Попробуйте этот пример:

# custom function, I prefer case_when (we could use nested if_else if needed.)
foo <- function(x){
  case_when(
    x %in%  c("m", "p", "w", "h", "n") ~ 1L,
    x %in%  c("k", "b", "g", "j", "f", "d") ~ 2L,
    TRUE ~ NA_integer_)
}

mydf %>% 
  mutate_at(vars(Var2.a:Var4.a), foo)

# # A tibble: 4 x 4
#   Var1  Var2.a Var3.a Var4.a
#   <chr>  <int>  <int>  <int>
# 1 A          2      2      2
# 2 B          1     NA      1
# 3 C          2      2      2
# 4 D          2     NA      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...