使用data.table,在某些字符之间返回一个新列

时间:2014-04-27 04:27:02

标签: string r data.table

我有一种感觉这可能是一个简单的问题,但我现在已经搜索过一段时间了,发现了许多有趣的相关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))

2 个答案:

答案 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)