我正在开展一个涉及总统候选人的项目,由于名称拼写和缩写的变化,我正在努力清理数据。例如,对希拉里克林顿来说,数据可能包括:
"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 )
答案 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创建。