我刚开始使用R编程。目前,我正在着名的Titanic数据集上练习特征工程。
除其他外,我想在我的数据集中提取人物的标题。
我有这些:
Montvila, Rev. Juozas
Johnston, Miss. Catherine Helen
想要得到这些:
Rev.
Miss.
我自己的方法不起作用。我无法弄清楚究竟是什么问题:
gsub("([A-Za-z:space:]+, )|(\.[A-Za-z:space:]+)", "", data_raw$Name)
希望有人可以帮助我!真是太棒了。
亲切的问候, 马库斯
答案 0 :(得分:1)
我们可以匹配字符串的开头(\\S+
)后面的一个或多个非空白字符(^
),后跟一个或多个空格(\\s+
)或({{ 1}})使用环顾四周匹配|
后跟字符,直到字符串结尾,并将其替换为空白(.
)
""
或者另一种选择是将字符捕获为一个组(gsub("^\\S+\\s+|(?<=\\.).*$", "", str1, perl = TRUE)
#[1] "Rev." "Miss."
),并在替换中使用该捕获组的反向引用(([^.]+\\.)
)。
\\1
sub("^[^,]+,\\s+([^.]+\\.).*", "\\1", str1)
#[1] "Rev." "Miss."
答案 1 :(得分:1)
我建议使用一个正则表达式替换所有文本,但最后一个字母后面加一个点。
> x <- c("Montvila, Rev. Juozas", "Johnston, Miss. Catherine Helen")
> sub("^.*\\b([[:alpha:]]+\\.).*", "\\1", x)
[1] "Rev." "Miss."
或更简单的regmatches
解决方案:
> unlist(regmatches(x, regexpr("[[:alpha:]]+\\.", x)))
[1] "Rev." "Miss."
或者,如果你需要检查一个点,但是&#34;排除&#34;从匹配开始,使用带有regmatches
(perl=TRUE
)的PCRE正则表达式,允许在模式中使用外观:
> unlist(regmatches(x, regexpr("[[:alpha:]]+(?=\\.)", x, perl=TRUE)))
[1] "Rev" "Miss"
在这里,(?=\\.)
是一个积极的前瞻,需要在{1}之后的1+个字母,但在匹配中排除它。
<强>详情:
.
- 字符串的开头^
- 任意多个字符,尽可能多到最后...... .*
- 字边界\\b
- 第1组:一个或多个字母后跟文字([[:alpha:]]+\\.)
.
- 字符串末尾的任何0 +字符。使用TRE正则表达式,因此.*
匹配包括换行符的任何字符。
此外,在您的代码中,.
使用单个.
进行转义,这会导致错误,因为\
是一个错误的转义序列。必须使用双反斜杠定义正则表达式转义。