R 单独的;名称“;变成;“名字”;及;“姓氏”;数据帧列
我正在努力弄清楚如何在一个数据帧中将一列“Name”拆分为同一数据帧中的另外两列FistName和LastName。挑战在于我的一些名字有几个姓。基本上,我想取第一个单词(或字符串的元素)并将其放在FirstName列中,然后将下面的所有文本(当然减去空格)放在LastName列中 这是我的数据帧“tteam”R 单独的;名称“;变成;“名字”;及;“姓氏”;数据帧列,r,strsplit,R,Strsplit,我正在努力弄清楚如何在一个数据帧中将一列“Name”拆分为同一数据帧中的另外两列FistName和LastName。挑战在于我的一些名字有几个姓。基本上,我想取第一个单词(或字符串的元素)并将其放在FirstName列中,然后将下面的所有文本(当然减去空格)放在LastName列中 这是我的数据帧“tteam” NAME1)sub data.frame(FirstName = sub(" .*", "", tteam$NAME), LastName = sub("^\\S
NAME1)sub
data.frame(FirstName = sub(" .*", "", tteam$NAME),
LastName = sub("^\\S* ", "", tteam$NAME),
tteam[-1])
2)gsubfn::read.pattern在NAME中,您可以使用extract
fromtidyr
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
尝试:
或:
您可以使用包unglue:
我不认为你能把这个弄对。有些人有几个名字,有些人有几个姓氏,然后有一个叫做“中间名”的东西。我相信这篇文章应该会帮助你:注意,在现实世界中,这是一个毫无意义的练习——人们有多个名字或姓氏,把他们的姓氏放在第一位,姓氏放在第二位或第三位,我曾经听说过一个中国学生,他的三部分名字出现在学生档案数据库中,出现在所有6种可能的ABC排列中。名单上的姓氏也有一个“中间”名字。为了避免使用x[length(x)]。哎呀,我没有看到它,但是在tteamdesire中,中间的名字也与姓氏连接起来考虑stru split(name,”,n=2)
fromstringr
非常感谢所有的提交。选择这个答案是因为它简单。现在工作。再次感谢!
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!
data.frame(FirstName = sub(" .*", "", tteam$NAME),
LastName = sub("^\\S* ", "", tteam$NAME),
tteam[-1])
library(tteam)
cn <- c("FirstName", "LastName")
NAME <- as.character(tteam$NAME)
cbind( read.pattern(text = NAME, pattern = "^(\\S*) (.*)", col.names = cn), tteam[-1])
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
> 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"
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