【问题标题】:name splitting in base r基础 r 中的名称拆分
【发布时间】:2019-12-13 16:13:43
【问题描述】:

我有一个名字列表,这些名字以凌乱的方式写在一个列中。我正在尝试从该列中提取名字、中间名和姓氏以分别存储。

为此,我从每个名称条目中提取第一个单词并将其保存为名字。然后我删除每个条目的最后一个单词和第一个单词并将其保存为中间名。然后我 gsub 从每个条目中提取最后一个单词并将其保存为姓氏。

这给了我一个问题,因为对于只输入了一个名字的条目(所以“kevin”而不是“kevin bank”),我的代码将名字保存为姓氏(“kevin kevin”)。如果原始名称条目只有 1 个单词,我尝试使用删除 lastname 列的 for 循环修复它。当我尝试这个时,所有的姓氏条目都是空的,即使是那些有姓氏的!

这是我的代码:

df <- data.frame(ego = c("linda", "wendy pralice of rivera", "bruce springsteen", "dan", "sam"))

df$firstname <- gsub("([A-Za-z]+).*", "\\1", df$ego)
df$middlename <- gsub("^\\w*\\s*", "", gsub("\\s*\\w*\\.*$", "", df$ego))
df$lastname <- gsub("^.* ([A-Za-z]+)", "\\1", df$ego)
for(n in df$ego) {
  if(lengths(strsplit(n, " ")) == 1) {
    df$lastname <- ""
  }
}

我做错了什么?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    如果有 4 个字段,请在中间两个周围加上双引号。例如,a b c d 将更改为 a "b c" d,从而得到 s1。 (如果没有 4 个字段,则不进行任何替换并将 s1 设置为 df$ego。)

    如果恰好有两个字段,则在两者之间插入双引号。例如,a b 将更改为 a "" b。 (如果不完全是两个字段,则不进行替换并将s2 设置为s1)。

    终于读完了。

    s1 <- sub('^(\\w+) (\\w+ \\w+) (\\w)+$', '\\1 "\\2" \\3', df$ego)
    s2 <- sub('^(\\w+) (\\w+)$', '\\1 "" \\2', s1)
    read.table(text = s2, as.is = TRUE, fill = TRUE, 
      col.names = c("first", "middle", "last"))
    

    给予:

      first     middle        last
    1 linda                       
    2 wendy pralice of           a
    3 bruce            springsteen
    4   dan                       
    5   sam                       
    

    【讨论】:

    • 嘿,在我的数据集中发生了错误。有些人有多个中间名(请参阅我更新的问题)。您的示例不适用于这些情况,它将姓氏(字符串中的第 4 个单词)保存为新行的名字。你能解释一下你做了什么吗?也许我可以想出一个解决方法。
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2021-03-27
    • 2016-06-27
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多