如何切换字符串的第一个和最后一个元素的位置?

时间:2019-06-30 12:26:04

标签: r pattern-matching

我有一个数据框,其中的字符列的名称采用以下格式:"Lastname Middlename Title"。我需要交换"Lastname""Title",这会改变每一行有多少个中间名。

输入示例:

Doe John Mr. 
Smith John Doe Mr.

所需的输出:

Mr. John Doe 
Mr. John Doe Smith

3 个答案:

答案 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)