【问题标题】:Parsing names in mixed formats using R使用 R 以混合格式解析名称
【发布时间】:2017-08-30 14:35:13
【问题描述】:

我有一个混合格式的名称列表,我想将其分成包含 R 中名字和姓氏的列。示例数据集:

Names <- c("Mary Smith","Hernandez, Maria","Bonds, Ed","Michael Jones")

我们的目标是组装一个包含如下格式名称的数据框:

FirstNames <- c("Mary","Maria","Ed","Michael")
LastNames <- c("Smith","Hernandez","Bonds","Jones")
FinalData <- data.frame (FirstNames, LastNames)

我尝试了几种方法来选择名字或姓氏,具体取决于名称是仅由空格还是逗号空格分隔。例如,我想在 gsub 中使用正则表达式从逗号空格分隔名称的行中复制名字:

FirstNames2 <- gsub (".*,\\s","",Names)

这适用于包含 LastName, FirstName 格式的名称的行,但 gsub 将所有内容收集在具有 FirstName LastName 格式的名称的行中。

所以我的帮助请求是请告知:您将如何解决这个问题?在此先感谢大家!

【问题讨论】:

  • 是“LastName, FirstName”格式的带逗号总是的名字吗?或者他们可以切换吗?
  • 在我的列表中,它们始终采用姓氏、名字的格式。但是,如果我们能找到一种方法来处理这两种变化,它可能会对其他人有所帮助。谢谢!

标签: r regex text-mining


【解决方案1】:

这里是单线。该模式首先尝试 Firstname lastname,如果失败,它会尝试 lastname, firstname。没有使用任何包。

read.table(text = sub("(\\w+) (\\w+)|(\\w+), (\\w+)", "\\1\\4 \\2\\3", Names), as.is=TRUE)

给予:

       V1        V2
1    Mary     Smith
2   Maria Hernandez
3      Ed     Bonds
4 Michael     Jones

【讨论】:

  • 好的,所以我从中学到的东西和 drmariod 的答案是使用转义数字来指示正则表达式中的“捕获”组。正确的?谢谢!
  • 是的,“\\1”、“\\2”等是反向引用,(...) 是捕获组。
【解决方案2】:

您可以将 , 版本重新排列为第一个姓氏,然后只是 strsplit

FirstNames <- sapply(strsplit(gsub('(\\w+), (\\w+)', '\\2 \\1', Names), ' '), `[[`, 1)
LastNames <- sapply(strsplit(gsub('(\\w+), (\\w+)', '\\2 \\1', Names), ' '), `[[`, 2)

【讨论】:

    【解决方案3】:
    temp = strsplit(x = Names, split = "(, | )")
    do.call(rbind, lapply(1:length(temp), function(i){
        if (grepl(pattern = ", ", x = Names[i])){
            data.frame(F = temp[[i]][2], L = temp[[i]][1])
        }else{
            data.frame(F = temp[[i]][1], L = temp[[i]][2])
        }
    }))
    #        F         L
    #1    Mary     Smith
    #2   Maria Hernandez
    #3      Ed     Bonds
    #4 Michael     Jones
    

    【讨论】:

      猜你喜欢
      • 2020-10-30
      • 2020-07-22
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多