2017-02-22 41 views
1

Я пытаюсь использовать вариант dplyr recode в сочетании с mutate_all по всем переменным в наборе данных, но он не дает ожидаемого результата. Другие ответы, которые я нашел, не решает эту проблему (например Recode and Mutate_all in dplyr)Как использовать mutate_all и перекодировать правильно, используя dplyr?

Вот что я пытался:

library(tidyverse) 
library(car) 

# Create sample data 
df <- data_frame(a = c("Yes","Maybe","No","Yes"), b = c("No","Maybe","Yes","Yes")) 

# Using dplyr::recode 
df %>% mutate_all(funs(recode(., `1` = "Yes", `0` = "No", `NA` = "Maybe"))) 

не оказывает влияния на значения:

# A tibble: 4 × 2 
     a  b 
    <chr> <chr> 
1 Yes No 
2 Maybe Maybe 
3 No Yes 
4 Yes Yes 

То, что я хочу, может быть воспроизведен с помощью car :: Recode:

# Using car::Recode 
df %>% mutate_all(funs(Recode(., "'Yes' = 1; 'No' = 0; 'Maybe' = NA"))) 

Это желаемый результат:

# A tibble: 4 × 2 
     a  b 
    <dbl> <dbl> 
1  1  0 
2 NA NA 
3  0  1 
4  1  1 
+0

Это может быть сделаны без использования 'recode' слишком – akrun

+0

Я знаю, что это может быть сделано, но я хотел бы знать, что я Мне не хватает dplyr :: recode. Я бы хотел избежать подобных решений. –

+0

Не ответ, а простая альтернатива: 'df [] <- factor (unlist (df), levels = c (" Yes "," No "," Maybe "), labels = c (1, 0, NA)) ' –

ответ

5

Вы перевернули ключ/значения в dplyr::recode. Это работает для меня:

df %>% mutate_all(funs(recode(., Yes = 1L, No = 0L, Maybe = NA_integer_))) 

# A tibble: 4 × 2 
     a  b 
    <dbl> <dbl> 
1  1  0 
2 NA NA 
3  0  1 
4  1  1 

Обратите внимание, что он выдает ошибку, если вы не указали тип NA.

Также вы можете использовать кавычки или без значения (например: Оба Yes или 'Yes' работы)

+1

вправо, и вы не должны даже процитировать да, нет и т.д. –

+0

замечательное, спасибо за помощь. Я был каким-то образом смущен документами, но я думаю, это мое плохое! –