我有一个数据框,其中的字符列的名称采用以下格式:"Lastname Middlename Title"
。我需要交换"Lastname"
和"Title"
,这会改变每一行有多少个中间名。
输入示例:
Doe John Mr.
Smith John Doe Mr.
所需的输出:
Mr. John Doe
Mr. John Doe Smith
答案 0 :(得分:2)
您可以使用sub
和反向引用来实现。使用数据x <- c("Doe John Mr.", "Smith John Doe Mr.")
:
sub("^(\\w+)( .* )(\\w+\\.?)$", "\\3\\2\\1", x)
#### OUTPUT ####
[1] "Mr. John Doe" "Mr. John Doe Smith"
这捕获了三组:1)字符串^(\\w+)
中的第一个单词,2)第一个单词和最后一个单词( .* )
之间的所有内容,以及3)字符串中的最后一个单词,且值为0或1个期间(\\w+\\.?)$
。然后,它交换组1和3,而将2留在原处。
答案 1 :(得分:1)
我们可以使用strplit
。
str1 <- "Doe John Mr."
str2 <- "Smith John Doe Mr."
Reduce(paste, el(strsplit(str1, " "))[3:1])
# [1] "Mr. John Doe"
Reduce(paste, el(strsplit(str2, " "))[c(4, 2, 3, 1)])
# [1] "Mr. John Doe Smith"
答案 2 :(得分:0)
我用tokenizer
分割了输入字符串,然后以相反的顺序进行。我注意到您的示例是相反的顺序,所以这就是我要解决的问题。如果您还有其他示例,但它们不是相反的顺序,那么您所要做的就是按照需要的顺序排列它们。
library(tokenizers)
string <- "Doe John Mr. Smith Doe John Mr."
y <- tokenize_words(string, strip_punct = TRUE, simplify = TRUE)
rev(y)