我有一种感觉这可能是一个简单的问题,但我现在已经搜索过一段时间了,发现了许多有趣的相关Q / A,我仍然难过。
这是我需要学习的内容(诚实地说,我正在使用kaggle Titanic数据集,但我想使用data.table)...
假设您有以下data.table:
dt <- data.table(name=c("Johnston, Mr. Bob", "Stone, Mrs. Mary", "Hasberg, Mr. Jason"))
我希望我的输出只是标题“先生”,“太太”和“先生” - 哎呀,我们也可以省去这段时间。
我一直在玩(整夜)并发现使用正则表达式可能会得到答案,但我只能使用单个字符串,而不是使用整个data.table。< / p>
例如,
substr(dt$name[1], gregexpr(",.", dt$name[1]), gregexpr("[.]", dt$name[1]))
返回:
[1] ", Mr."
哪个很酷,我可以做一些进一步的处理来摆脱“,”和“。”,但是,我的乐观主义者(/优化者)觉得那是丑陋的,粗暴的,无懈可击的。
此外,即使我想解决这个问题,(我也很难承认)我不知道如何将其应用到数据J中。...
那么,如何在dt中添加一个名为“Title”的列,其中包含:
[1] "Mr"
[2] "Mrs"
[3] "Mr"
我坚信,如果我能够使用正则表达式来选择和提取data.table中的数据,那么我每天可能会使用100x。所以,先谢谢你帮我弄清楚这个关键技术。
PS。我是一个优秀的难民,在excel我会这样做:
=mid(data, find(", ", data), find(".", data))
答案 0 :(得分:2)
dt[, Title:=sub(".*?, (.*?)[.].*", "\\1", name)]
但是我会把这个留在这里以防万一其他人需要帮助,或者或许还有更好的方法来做到这一点!
答案 1 :(得分:1)
您可以使用stringr
包
library(stringr)
str_extract(dt$name, "M.+\\.")
[1] "Mr." "Mrs." "Mr."
正则表达式的不同变体将允许您提取其他标题,如Dr.,Master或Reverend,这些也可能是您感兴趣的。
获取&#34;,&#34;之间的所有字符和&#34;。&#34; (包括)你可以使用
str_extract(dt$name, ",.+\\.")
然后使用str_sub
(也来自stringr包)删除结果的第一个和最后一个字符。
但是当我考虑更多时,我可能会使用grepl
为泰坦尼克号数据集中的所有不同标题创建指标变量。例如
dr_ind <- grepl("Dr|Doctor", dt$name)
titled_ind <- grepl("Count|Countess|Baron", dt$name)
等