如何使用mutate和ifelse将字符串数据解析为新变量?
我对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")
任何指导,将是非常赞赏。
使用正则表达式匹配似乎更容易在这里。 .*?
匹配所有字符,直到后面的第一个匹配项。 (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)
非常感谢!看起来我试图避免元字符需要结束,我插入它并工作!现在搜索并阅读元字符所以我可以申请这个! –
我看到了,非常感谢! –
我已经阅读了我的正则表达式,发现了一个更方便的方法来捕获所有未知的标题,我之前没有包含这些标题: titanic.full % 突变( “*。?,(+ \\)*” AllTitles =子( “\\ 1”,名称)) –
如果你想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.格罗滕迪克用于提供数据。
巢'ifelse'。 'ifelse(str_detect(Name,“Mr.”),“Mr.”,ifelse(str_detect(Name,“Mrs.”,“Mrs.”,“Other”))' – Psidom
'case_when'是你的朋友 – dshkol
所以,我试过如下:变异(titanic.full,标题= ifelse(str_detect(名称, “先生”), “先生”,ifelse(str_detect(名称, “夫人”), “太太”,“其他“)),但是这似乎不起作用,因为出现了一个意外的符号错误 –