【问题标题】:With data.table, return between certain characters into a new column使用data.table,在某些字符之间返回一个新列
【发布时间】:2014-04-27 04:27:01
【问题描述】:

我觉得这可能是一个简单的问题,但我已经通过 SO 搜索了一段时间,发现了许多有趣的相关 Q/A,我仍然很难过。

这是我需要学习的内容(老实说,我正在玩 kaggle Titanic 数据集,但我想使用 data.table)...

假设您有以下 data.table:

dt <- data.table(name=c("Johnston, Mr. Bob", "Stone, Mrs. Mary", "Hasberg, Mr. Jason"))

我希望我的输出只是标题“先生”、“夫人”和“先生”。 -- 哎呀,我们也可以省略句号。

我一直在玩(整晚),发现使用正则表达式可能会得到答案,但我只能让它在单个字符串上工作,而不是在整个 data.table 上工作。

例如,

substr(dt$name[1], gregexpr(",.", dt$name[1]), gregexpr("[.]", dt$name[1]))

返回:

[1] ", Mr."

这很酷,我可以做一些进一步的处理来摆脱“,”和“。”,但是,我的乐观主义者(/优化器)觉得这很丑陋、粗暴和低效。

此外,即使我想解决这个问题,(承认我很痛苦)我不知道如何将它应用到 data.table 的 J....

那么,如何在 dt 中添加一个名为“Title”的列,其中包含:

[1] "Mr"
[2] "Mrs"
[3] "Mr"

我坚信,如果我能够使用正则表达式在 data.table 中选择和提取数据,我可能会每天使用 100 次。所以提前感谢你帮助我找出这个关键技术。

PS。我是 excel 难民,在 excel 中我会这样做:

=mid(data, find(", ", data), find(".", data))

【问题讨论】:

  • 注意,我发现以下网站很有帮助:regexr.com 它可以让您使用带有示例文本的正则表达式。

标签: string r data.table


【解决方案1】:

嗯..我可能已经想通了:

dt[, Title:=sub(".*?, (.*?)[.].*", "\\1", name)]

但我将把它留在这里以防其他人需要帮助,或者也许有更好的方法!

【讨论】:

  • 对我来说似乎是最佳解决方案,我会这样做
【解决方案2】:

您可以使用stringr

library(stringr)
str_extract(dt$name, "M.+\\.")

[1] "Mr."  "Mrs." "Mr." 

正则表达式的不同变体可让您提取您可能感兴趣的其他头衔,例如 Dr.、Master 或 Reverend。

获取 "," 和 "." 之间的所有字符(含)你可以使用

str_extract(dt$name, ",.+\\.")

然后使用str_sub 删除结果的第一个和最后一个字符(也来自 stringr 包)。

但当我想得更多时,我可能会使用grepl 为泰坦尼克号数据集中的所有不同标题创建指标变量。例如

dr_ind <- grepl("Dr|Doctor", dt$name)
titled_ind <- grepl("Count|Countess|Baron", dt$name)

等等

【讨论】:

  • 有趣,只要是先生或夫人都可以,但偶尔我可能会得到诸如“唐”或“伯爵夫人”之类的头衔,因此将文本分段更重要“、”(注意空格)和“.”
  • 我要咳嗽在这里给自己一个正确的答案,因为我的解决方案直接在 data.table 框架中工作,除了基础之外不需要任何东西。您的解决方案虽然有效,但请注意“我不知道如何将其应用到 data.table 的 J 中。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2016-12-19
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2021-07-24
相关资源
最近更新 更多