在R中用逗号分割和重新排序字符串

jes*_*tme 4 r strsplit dataframe

我有数年有关个人的数据,但是他们的姓名每年的格式不同。名称中的一半已经按“ First Last”顺序排列,但是我不知道如何成功编辑另一半(“ Last,First”)。

这是样本df:

name <- c("First1 Last1","Last2, First2", "Last3, First3", "First4 Last4", "First5 Last5")
salary <-c(51000, 72000,125000,67000,155000)
year <-c(2012,2014,2013,2013,2014)

df <- data.frame(name, salary, year, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的方法:用逗号分隔文本:

df$name2 <- strsplit(df$name, ", ") #to split the character string by comma
df$name3 <-paste(df$name2, collapse=" ") #to collapse the newly created vectors back into a string
df$name4 <-paste(rev(df$name2)) #to try pasting each vector in reverse order
df$name5 <-paste(rev(df$name2)[2:1]) #trying again...
Run Code Online (Sandbox Code Playgroud)

我已经打印了正确的名称,但是倒退了,并且将它们打印在错误的行上,但是尽管进行了谷歌搜索,但我仍然无法正常工作。我究竟做错了什么?

eti*_*nne 6

您可以使用正则表达式:

df$name <- sub("(L[A-Za-z0-9]+).*\\s+(F[A-Za-z0-9]+).*","\\2 \\1",df$name)

# df
#           name salary year
# 1 First1 Last1  51000 2012
# 2 First2 Last2  72000 2014
# 3 First3 Last3 125000 2013
# 4 First4 Last4  67000 2013
# 5 First5 Last5 155000 2014
Run Code Online (Sandbox Code Playgroud)

代码查找的单词以大写字母L开头,然后是一些字母/数字,然后是一些符号,一个空格,然后是一个以大写字母F开始的单词,再是一些字母/数字,然后是一些符号。

然后,它首先将以F开头的一个单词(即(F[A-Za-z0-9]+)),然后以L开头的一个单词(即)重新排列两个单词的顺序(L[A-Za-z0-9]+)

如您所见,该代码删除了逗号(这似乎是您想要的输出)。

使用新信息,使用代码:

df$name <- sub('(.*)\\,\\s+(.*)','\\2 \\1', df$name)

# sub('(.*)\\,\\s+(.*)','\\2 \\1',name)
# [1] "John Smith"       "Marcus Green"     "Mario Sanchez"    "Jennifer Roberts" "Sammy Lee"
Run Code Online (Sandbox Code Playgroud)

在这里,我们正在寻找逗号前的字符,然后是空格,然后是其他字符。然后,我们将第一组和第二组重新排序以具有所需的输出。

注意:我假设如果没有逗号,则名称已经按照正确的顺序排列(在您的注释中似乎是如此)。