2017-11-11 148 views
0

我对R更新,我正在玩泰坦尼克号的kaggle数据集。我已经观看了David Langer关于探索这个数据集的很棒的YouTube视频,并且他能够用for循环解析每个乘客的头衔。然而,我忍不住想要用mutate和stringr做一个更简单的方法。如何使用mutate和ifelse将字符串数据解析为新变量?

注: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") 

任何指导,将是非常赞赏。

+0

巢'ifelse'。 'ifelse(str_detect(Name,“Mr.”),“Mr.”,ifelse(str_detect(Name,“Mrs.”,“Mrs.”,“Other”))' – Psidom

+0

'case_when'是你的朋友 – dshkol

+0

所以,我试过如下:变异(titanic.full,标题= ifelse(str_detect(名称, “先生”), “先生”,ifelse(str_detect(名称, “夫人”), “太太”,“其他“)),但是这似乎不起作用,因为出现了一个意外的符号错误 –

回答

1

使用正则表达式匹配似乎更容易在这里。 .*?匹配所有字符,直到后面的第一个匹配项。 (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) 
+0

非常感谢!看起来我试图避免元字符需要结束,我插入它并工作!现在搜索并阅读元字符所以我可以申请这个! –

+0

我看到了,非常感谢! –

+0

我已经阅读了我的正则表达式,发现了一个更方便的方法来捕获所有未知的标题,我之前没有包含这些标题: titanic.full < - titanic.full%>% 突变( “*。?,(+ \\)*” AllTitles =子( “\\ 1”,名称)) –

0

如果你想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 

由于G.格罗滕迪克用于提供数据。