如何将Mutate与ifelse一起使用来将字符串数据解析为新变量?

时间:2017-11-11 00:41:02

标签: r string if-statement dplyr stringr

我是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")

非常感谢任何指导。

2 个答案:

答案 0 :(得分: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)

答案 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. Grothendieck 提供数据。