R 姓

R 姓,r,data-cleaning,R,Data Cleaning,我有一套姓氏和姓氏格式的名字 Name Pos Team Week.x Year.x GID.x h.a.x Oppt.x Week1Points DK.salary.x Week.y Year.y GID.y 1 Abdullah, Ameer RB det 1 2015 2995 a sdg 19.4 4000 2 2015 2995 2 Adams, Davante WR gnb

我有一套姓氏和姓氏格式的名字

             Name Pos Team Week.x Year.x GID.x h.a.x Oppt.x Week1Points DK.salary.x Week.y Year.y GID.y
1 Abdullah, Ameer  RB  det      1   2015  2995     a    sdg        19.4        4000      2   2015  2995
2  Adams, Davante  WR  gnb      1   2015  5263     a    chi         9.9        4400      2   2015  5263
3 Agholor, Nelson  WR  phi      1   2015  5378     a    atl         1.5        5700      2   2015  5378
4    Aiken, Kamar  WR  bal      1   2015  5275     a    den         0.9        3300      2   2015  5275
5 Ajirotutu, Seyi  WR  phi      1   2015  3877     a    atl         0.0        3000     NA     NA    NA
6   Allen, Dwayne  TE  ind      1   2015  4551     a    buf        10.7        3400      2   2015  4551
这只是前6行。我想把名字换成姓。这是我试过的

> strsplit(DKPoints$Name, split = ",")
这会分割name变量,但是有空格,所以我尝试清除它们

> str_trim(splitnames)
但结果并不是这样的。这是它们的样子

  [1] "c(\"Abdullah\", \" Ameer\")"          "c(\"Adams\", \" Davante\")"          
  [3] "c(\"Agholor\", \" Nelson\")"          "c(\"Aiken\", \" Kamar\")"            
  [5] "c(\"Ajirotutu\", \" Seyi\")"          "c(\"Allen\", \" Dwayne\")"
有什么建议吗?我想得到一个数据框的列

Ameer Abdullah
Davabte Adams
Nelson Agholor
Kamar Aiken
任何建议都将不胜感激。谢谢

sub("(\\w+),\\s(\\w+)","\\2 \\1", df$name)

(\\w+
匹配名称,
,\\s
匹配
”,“
(逗号和空格),
\\2\\1
按相反顺序返回名称。

单向使用
srt\u split\u fixed

library(stringr)
#split Name into two columns
splits <- str_split_fixed(df$Name, ", ", 2)

#now merge these two columns the other way round
df$Name <- paste(splits[,2], splits[,1], sep = ' ')
假设所有的名字都是“Lastname,firstname”,您可以这样做:

names <- c("A, B","C, D","E, F")


newnames <- sapply(strsplit(names, split=", "),function(x) 
  {paste(rev(x),collapse=" ")})

> newnames
[1] "B A" "D C" "F E"
试试这个:

df$Name2<-paste(gsub("^.+\\,","",df$Name),gsub("\\,.+$","",df$Name),sep=" ")

df$name2请给我们您的数据的
dput()。添加了一个额外的步骤来清除此问题。df$Name=str_trim(df$Name)当我运行您的解决方案时,我会在每个“新”名称的开头获得一个前导空格。你是想在
,“
”上分手吗?我想
stri\u extract\u所有
stringi
中提取的
都会更快。啊,是的@Heroka,谢谢你是对的。我应该在
,“
@akrun是的,谢谢akrun你是对的:)为了公平起见,你可以加上它
stri_extract_all
的工作方式与当前提供的解决方案中最快的str_split_fixed
不同。@JohannesNE,如果您想忽略姓氏中的连字符怎么办?您的代码将“A-B,C”变成“A-C B”,而我想要的是“C-A-B”。@phil\t,您可以使用[\\w-]+在姓氏组中包含连字符(或任何其他字符)。例如
sub([\\w-]+),\\s(\\w+),“\\2\\1”,df$name)
。这对我来说效果更好
sub((^.*),\\s(.*$),“\\2\\1”),。
从速度上讲,你无法触及正则表达式解决方案,但你也没有做太多优化你的方法。(没有使用
fixed=TRUE
,使用
sapply
而不是
vapply
…)我无意编写一个快速解决方案,测试只是事后考虑。我只是试图恢复
strsplit
的可信度:-)
Unit: milliseconds
     expr       min        lq      mean    median        uq       max neval cld
   heroka 1103.0419 1242.6418 1276.7765 1274.6746 1311.1218 1557.8579    50   c
 lyzander  149.4466  177.0036  206.4558  191.1249  218.1756  345.7960    50  b 
 johannes  142.7585  144.5943  151.0078  146.0602  147.1980  284.2589    50 a  
df$Name2<-paste(gsub("^.+\\,","",df$Name),gsub("\\,.+$","",df$Name),sep=" ")