我有一个包含一些名字的向量。我想在每一行中提取标题,基本上是“,”(包括空格)和“。”之间的所有内容。
> head(combi$Name)
[1] "Braund, Mr. Owen Harris"
[2] "Cumings, Mrs. John Bradley (Florence Briggs Thayer)"
[3] "Heikkinen, Miss. Laina"
[4] "Futrelle, Mrs. Jacques Heath (Lily May Peel)"
[5] "Allen, Mr. William Henry"
[6] "Moran, Mr. James"
我认为gsub
可能会有用但我很难找到合适的正则表达式来满足我的需求。
答案 0 :(得分:10)
1)sub sub
> sub(".*, ([^.]*)\\..*", "\\1", Name)
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr"
1a)子变体 gsub
的这种方法也有效:
> sub(".*, |\\..*", "", Name)
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr"
2)strapplyc 或在gusbfn包中使用strapplyc
,可以使用更简单的正则表达式来完成:
> library(gsubfn)
>
> strapplyc(Name, ", ([^.]*)\\.", simplify = TRUE)
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr"
2a)strapplyc变异这个似乎有最简单的正则表达式。
> library(gsubfn)
>
> sapply(strapplyc(Name, "\\w+"), "[", 2)
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr"
3)strsplit 第三种方式是使用strsplit
> sapply(strsplit(Name, ", |\\."), "[", 2)
[1] "Mr" "Mrs" "Miss" "Mrs" "Mr" "Mr"
添加了其他解决方案。将gsub
更改为sub
(尽管gsub
也有效)。
答案 1 :(得分:2)
不要注意G.格洛腾迪克的答案中缺少任何东西。我只想使用sub
和非贪婪重复添加解决方案:
vec <- c("Moran, Mr. James",
"Rothschild, Mrs. Martin (Elizabeth L. Barrett)")
sub(".*, (.+?)\\..*", "\\1", vec)
# [1] "Mr" "Mrs"
使用regexpr
,regmatches
和lookbehind / lookahead的另一种选择:
regmatches(vec, regexpr("(?<=, ).+?(?=\\.)", vec, perl = TRUE))
# [1] "Mr" "Mrs"