我是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")
非常感谢任何指导。
答案 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 提供数据。