Как я могу использовать Mutate с ifelse для анализа строковых данных в новую переменную?

Я новичок в R и играю с набором данных Titanic kaggle. Я смотрел отличные видеоролики Дэвида Лангера на YouTube об изучении этого набора данных, и он может разобрать названия каждого пассажира с помощью цикла for. Однако я не могу не заметить, что есть более простой способ сделать это с помощью mutate и stringr.

примечание: titanic.full = data.frame

Это мое лучшее предположение... очевидно, что это не работает:

mutate(titanic.full, Title = ifelse(str_detect(titanic.full$Name, "Mr."), "Mr.") elseif(str_detect(titanic.full$Name, "Mrs."), "Mrs."), "Other")

Любое руководство будет очень признательно.


person Jeff Henderson    schedule 11.11.2017    source источник
comment
Гнездо ifelse. ifelse(str_detect(Name, "Mr."), "Mr.", ifelse(str_detect(Name, "Mrs."), "Mrs.", "Other"))   -  person Psidom    schedule 11.11.2017
comment
case_when здесь твой друг   -  person dshkol    schedule 11.11.2017
comment
Итак, я попробовал следующее: mutate(titanic.full, Title = ifelse(str_detect(Name, Mr.), Mr., ifelse(str_detect(Name, Mrs.), Mrs., Other)) но это не похоже работать, так как возникла непредвиденная ошибка символа   -  person Jeff Henderson    schedule 11.11.2017


Ответы (2)


Здесь проще использовать сопоставление с регулярным выражением. .*? соответствует всем символам до первого вхождения следующего. (Mr|Mrs|Miss|$) соответствует любой из опций, где $ означает конец строки (чтобы захватить все строки, которые не имеют ни одного из предыдущих значений). Наконец, .* соответствует тому, что осталось. "\\1" относится к символам, которые соответствуют части шаблона в круглых скобках.

titanic.full %>% mutate(Title = sub(".*?(Mr|Mrs|Miss|$).*", "\\1", Name))

Примечание. Поскольку входные данные не были воспроизведены в вопросе, мы приводим их здесь:

u <- "https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/datasets/Titanic.csv"
titanic.full <- read.csv(u)
person G. Grothendieck    schedule 11.11.2017
comment
Спасибо большое! Похоже, моим попыткам избежать метасимволов нужно положить конец. Я подключил это, и это сработало! Теперь нужно найти и прочитать о метасимволе, чтобы я мог применить это! - person Jeff Henderson; 11.11.2017
comment
Я вижу это. Спасибо большое! - person Jeff Henderson; 13.11.2017
comment
Я прочитал свои регулярные выражения и нашел еще более удобный способ захватить все неизвестные заголовки, которые я не включил раньше: titanic.full ‹- titanic.full %›% mutate(AllTitles = sub(.*?, (.+\\.).*, \\1, Имя)) - person Jeff Henderson; 16.11.2017

Если вам нужно решение tidyverse, вы можете сделать следующее:

library(tidyverse)

df <- "https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/datasets/Titanic.csv"
df <- read.csv(df, stringsAsFactors = FALSE)
df <- as_tibble(df)
df

df %>% 
  extract(Name, 
          "Title",
          "(Mr|Mrs|Miss) ([^ ]+)", 
          remove = FALSE) %>% 
  select(Name, Title)

Что возвращает:

# A tibble: 1,313 x 2
                                            Name Title
 *                                         <chr> <chr>
 1                  Allen, Miss Elisabeth Walton  Miss
 2                   Allison, Miss Helen Loraine  Miss
 3           Allison, Mr Hudson Joshua Creighton    Mr
 4 Allison, Mrs Hudson JC (Bessie Waldo Daniels)   Mrs
 5                 Allison, Master Hudson Trevor  <NA>
 6                            Anderson, Mr Harry    Mr
 7              Andrews, Miss Kornelia Theodosia  Miss
 8                        Andrews, Mr Thomas, jr    Mr
 9  Appleton, Mrs Edward Dale (Charlotte Lamson)   Mrs
10                        Artagaveytia, Mr Ramon    Mr
# ... with 1,303 more rows

Благодаря Г. Grothendieck за предоставление данных.

person tyluRp    schedule 11.11.2017