Перекодировать несколько политомных переменных - PullRequest
1 голос
/ 04 ноября 2019

Этот вопрос касается перекодирования политомных переменных в большой набор данных. Поскольку данные велики, и перекодирование должно выполняться для многих переменных, я ищу более гибкий способ вызова всех соответствующих переменных и выполнения перекодирования. Есть много решенных проблем с перекодированием (например, Перекодирование нескольких переменных в R ), но они не вписываются в специфику этого вопроса. Ниже приведен пример данных:

df<-data.frame("id"=c(1:5),
           "ax1"=c(2,1,4,3,4),
           "ax2"=c(7,3,6,2,2),
           "bx1"=c(3,5,7,1,2),
           "bx2"=c(1,3,1,5,2),
           "cx1"=c(1,1,7,1,6),
           "cx2"=c(3,9,5,5,4)) 

Например, я хотел бы перекодировать ax1, bx1 и cx1. Для этих переменных я хочу перекодировать 1, 2, 3, 4 как 0, 1, 1, 0 соответственно и перекодировать как NA в противном случае. С использованием пакета 'dplyr' я попробовал

df <- df %>%  
 mutate_at( vars(ends_with("x1")),
         list(~ ifelse( . == 1, 0, ifelse(.== 2, 1, ifelse(.==3, 1, ifelse(.==4, 0,NA))))))

Однако это не дает ожидаемого результата. Ожидаемый результат будет выглядеть как

   id ax1 ax2 bx1 bx2 cx1 cx2
1  1   1   7   1   1   0   3
2  2   0   3  NA   3   0   9
3  3   0   6  NA   1  NA   5
4  4   1   2   0   5   0   5
5  5   0   2   1   2  NA   4

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Другая возможность:

df %>% mutate_at(vars(ends_with("x1")), 
    ~case_when(. %in% c(1,4) ~ 0,
               . %in% c(2,3) ~ 1))

(Не уверен, зачем вам нужен list() там?)

3 голосов
/ 04 ноября 2019

В dplyr есть функция recode специально для этого

library(dplyr)
df %>%  
   mutate_at(vars(ends_with("x1")),
        ~recode(., `1` = 0, `2` = 1, `3` = 1, `4` = 0, .default = NA_real_)))

#  id ax1 ax2 bx1 bx2 cx1 cx2
#1  1   1   7   1   1   0   3
#2  2   0   3  NA   3   0   9
#3  3   0   6  NA   1  NA   5
#4  4   1   2   0   5   0   5
#5  5   0   2   1   2  NA   4
...