2016-11-03 2 views
0

Рассмотрим следующий примерdplyr: как (сжато) использовать мутате условно для разных случаев?

data <- data_frame(name = c('A','B','C','C',NA,'D')) 

> data 
# A tibble: 6 × 1 
    name 
    <chr> 
1  A 
2  B 
3  C 
4  C 
5 <NA> 
6  D 

Вот, я знаю, что переменная name фактически отображает на 'A' -> 'one' и 'B' -> 'two'. Я просто хотел бы создать переменную, которая получает значение отображения. Конечно, в моем исходном наборе данных у меня есть еще много случаев для сопоставления.

Что-то, что не Работа следующая.

data <- data %>% 
    mutate(mapping = ifelse(name == 'A', 'one', name), 
     mapping = ifelse(name == 'B', 'two', name)) 
> data 
# A tibble: 6 × 2 
    name mapping 
    <chr> <chr> 
1  A  A 
2  B  two 
3  C  C 
4  C  C 
5 <NA> <NA> 
6  D  D 

Что здесь не так? Каков наиболее эффективный способ сделать это в dplyr?

Большое спасибо!

+3

Я думаю, что выражения ifelse должны быть ifelse (имя == 'A', 'one', name). В настоящий момент ifelse ищет переменную с именем mapping в вашем фрейме данных, и она еще не существует. – gfgm

+0

спасибо, но это все еще не работает должным образом. –

+1

Вы можете вставлять операторы ifelse, если вам придется жестко кодировать все значения отображения. то есть 'ifelse (name == 'A', 'one', ifelse (name == 'B', 'two', ....)) – Craig

ответ

8

Если вы хотите избежать вложенных ifelse, вы должны просто создать фрейм данных отображения и внутреннее соединение с ним.

mapping_df <- data.frame(name = c('A', 'B', 'C' . . . . 'Z'), mapping = c(1:26)) 

left_join(data, mapping_df, by = "name") 
+0

очень умный. его неудачный нет никакого готового решения 'dplyr' для этого, но это может быть даже лучше –

1

Для двух значений вы могли бы попробовать что-то вроде:

data <- data %>% 
    mutate(mapping = ifelse(name == 'A', 'one', 
    ifelse(name == 'B', 'two', 'other'))) 

Однако вы бы лучше создать отдельный кадр данных, содержащий карту, а затем с помощью dplyr :: left_join(), чтобы добавить его к вашему основному df.

0
data %>% mutate(mapping = recode(name, A="one", B="two")) 

Recode может пригодиться при отсутствии замены.