用姓氏替换全名,使用凌乱的数据替换首字母

时间:2018-03-03 21:33:17

标签: r regex string grep dplyr

我正在开展一个涉及总统候选人的项目,由于名称拼写和缩写的变化,我正在努力清理数据。例如,对希拉里克林顿来说,数据可能包括:

"clinton", "clinton, hillary rodham", "clinton, hilary”, clinton, hil”

有没有办法将所有名称转换为格式:姓氏,首字母? (即:clinton, h.

到目前为止,我已将所有条目转换为小写,并尝试以下替换:

for (i in 1:nrow(df)){
  if ((df$can_name %like% c("clinton, hilary", "hillary", "clinton, hillary rodham", "clinton, hilary"))==TRUE){
  df$can_name <- ‘clinton, h.'
  }
}

然而,我有超过100,000个观察结果,所以这对每个候选人来说都是非常繁琐的。在过去,我使用grep来分割和替换字符串,但在这种情况下我不确定如何处理中间名和拼写错误。我对正则表达式不是很熟悉,所以任何建议都会非常感谢!

修改 我最终使用了Onyambu的答案。对于我的最终解决方案,我决定只使用候选人的姓氏,并能够使用|替换多个变体操作员。这是代码:

sub(".*clinton.*|.*hilary.*|.*hillary.*", "clinton", df$can_name )

3 个答案:

答案 0 :(得分:1)

您可以使用应用功能。它们被矢量化并提供更快的迭代方式。你可以这样做:

df <- data.frame(vec = c('c','b','a','clinton', 'clinton, hillary rodham', 'clinton, hilary', 'clinton, hil'))

namesp <- c('clinton', 'clinton, hillary rodham', 'clinton, hilary', 'clinton, hil')

df$can_name <- sapply(df$vec, function(x) if(x %in% namesp) return('clinton, h.') else return('not found'))
print(df)

                       vec    can_name
1:                       c   not found
2:                       b   not found
3:                       a   not found
4:                 clinton clinton, h.
5: clinton, hillary rodham clinton, h.
6:         clinton, hilary clinton, h.
7:            clinton, hil clinton, h.

答案 1 :(得分:1)

您可以使用sub

   sub(".*Clinton.*","Clinton, h.", df$can_name)

答案 2 :(得分:1)

通过创建包含完美数据的“查找表”并将其与主(混乱)数据框中的容易提取的字段合并,以节省时间。

0

从您的主数据中轻松提取并合并。始终保持良好的习惯,可以保留“原始”数据列以进行错误检查。

# Your Main Data (dirty)
df <- tibble(name = c("clinton", 
                "clinton, hillary rodham",
                "clinton, hillary",
                "clinton, hil") )

# Your Perfect Lookup Data 
lookup_table <- tibble(
      first_name = "Hillary",
      middle_name = "Rodham",
      last_name = "Clinton")

这项技术可确保您获得完美的数据并且可扩展。

注意:上面的正则表达式仅从给出的示例中提取姓氏。不确定如果只给一个名字(“布什”,“克林顿”),是否打算/如何区分候选人比尔/希拉里·克林顿或杰布/乔治/乔治·布什。

reprex package(v0.2.0)于2018-07-28创建。