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)
我已经打印了正确的名称,但是倒退了,并且将它们打印在错误的行上,但是尽管进行了谷歌搜索,但我仍然无法正常工作。我究竟做错了什么?
您可以使用正则表达式:
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)
在这里,我们正在寻找逗号前的字符,然后是空格,然后是其他字符。然后,我们将第一组和第二组重新排序以具有所需的输出。
注意:我假设如果没有逗号,则名称已经按照正确的顺序排列(在您的注释中似乎是如此)。
归档时间: |
|
查看次数: |
441 次 |
最近记录: |