【问题标题】:Separate "Name" into "FirstName" and "LastName" columns of data frame将“名称”分成数据框的“名字”和“姓氏”列
【发布时间】:2014-10-21 14:32:33
【问题描述】:

我正在努力弄清楚如何将数据框中的单列“名称”拆分为同一数据框中的另外两列 FistName 和 LastName。挑战是我的一些名字有几个姓氏。本质上,我想取第一个单词(或字符串的元素)并将其放入 FirstName 列,然后将所有后续文本(当然减去空格)放入 LastName 列。

这是我的 DataFrame “团队”

NAME <- c('John Doe','Peter Gynn','Jolie Hope-Douglas', 'Muhammad Arnab Halwai')
TITLE <- c("assistant", "manager", "assistant", "specialist")
tteam<- data.frame(NAME, TITLE)

我想要的输出是这样的:

FirstName <- c("John", "Peter", "Jolie", "Muhammad")
LastName <- c("Doe", "Gynn", "Hope-Douglas", "Arnab Halwai")
tteamdesire <- data.frame(FirstName, LastName, TITLE)

我已尝试使用以下代码创建一个仅包含名称的新数据框,该数据框允许我从第一列中提取名字。但是,我无法按任何顺序排列姓氏。

names <- tteam$NAME ##  puts full names into names vector
namesdf <- data.frame(do.call('rbind', strsplit(as.character(names),' ',fixed=TRUE))) 
## splits out all names into a dataframe PROBLEM IS HERE!

【问题讨论】:

  • 我认为您无法正确理解这一点。有些人有几个名字,有些人有几个姓氏,还有一种叫做“中间名”的东西。
  • 我相信这篇文章应该对你有所帮助:stackoverflow.com/questions/8299978/…
  • 请注意,在现实世界中,这是一个毫无意义的练习——人们有多个名字或姓氏,把他们的姓放在第一位,姓放在第二位或第三位,我曾经听说一个中国学生的由三部分组成的姓名以 A B C 的所有 6 种可能排列出现在学生记录数据库中。

标签: r strsplit


【解决方案1】:

您可以使用 extract 中的 tidyr

 library(tidyr)
 extract(tteam, NAME, c("FirstName", "LastName"), "([^ ]+) (.*)")
 #  FirstName     LastName      TITLE
 #1      John          Doe  assistant
 #2     Peter         Gynn    manager
 #3     Jolie Hope-Douglas  assistant
 #4  Muhammad Arnab Halwai specialist

【讨论】:

  • 非常感谢您提交的所有内容。选择这个答案是因为它简单。现在工作。再次感谢!
【解决方案2】:

试试:

> firstname = sapply(strsplit(NAME, ' '), function(x) x[1])
> firstname 
[1] "John"     "Peter"    "Jolie"    "Muhammad"

> lastname = sapply(strsplit(NAME, ' '), function(x) x[length(x)])
> lastname
[1] "Doe"          "Gynn"         "Hope-Douglas" "Halwai"      

或:

> ll = strsplit(NAME, ' ')
> 
> firstname = sapply(ll, function(x) x[1])
> lastname = sapply(ll, function(x) x[length(x)])
> 
> firstname
[1] "John"     "Peter"    "Jolie"    "Muhammad"
> lastname
[1] "Doe"          "Gynn"         "Hope-Douglas" "Halwai"      

【讨论】:

  • 列表中的姓氏也有一个“中间名”。为了避免这种情况,我使用了 x[length(x)]。
  • 糟糕,我没看到,但是在tteamdesire中,中间名也和姓氏连接在一起
  • stringr考虑str_split(NAME, " ", n=2)
【解决方案3】:

1) 子

data.frame(FirstName = sub(" .*", "", tteam$NAME), 
           LastName = sub("^\\S* ", "", tteam$NAME),
           tteam[-1])

2) gsubfn::read.patternNAME&lt;- 中,如果as.character 已经是字符(而不是因子),我们可以省略:

library(tteam)

cn <- c("FirstName", "LastName")
NAME <- as.character(tteam$NAME)

cbind( read.pattern(text = NAME, pattern = "^(\\S*) (.*)", col.names = cn), tteam[-1])

更新将解决方案更新为 tteam 并添加第二个解决方案。

【讨论】:

    【解决方案4】:

    你可以使用包脱胶

    library(unglue)
    unglue_unnest(tteam, NAME, "{FirstName} {LastName}")
    #>        TITLE FirstName     LastName
    #> 1  assistant      John          Doe
    #> 2    manager     Peter         Gynn
    #> 3  assistant     Jolie Hope-Douglas
    #> 4 specialist  Muhammad Arnab Halwai
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2019-05-19
      • 2014-07-23
      • 2020-12-22
      相关资源
      最近更新 更多