如何重置字符串中单词的顺序

时间:2018-02-22 03:40:01

标签: r character

我有一个角色:

ms<-"DC, MD, MA, Wash, Balt, Bos, x, y, z"

我希望像这样重新排序:

ms<-"DC, Wash, MD, Balt, MA, Bos, x, y, z"

由于我想对不同的字符多次重复但是使用相同的逻辑,我不想每次都手动更改它,而是使用一般功能。假设它的订单现在 1,2,3,4,5,6,7,8,9 我想将其转换为 1,4,2,5,3,6 ,7,8,9- 即可。角色可能有6到任意数量的物质,但我希望转换只发生在前6个,其余的应该保持不可触及。我试过像ms <- ms[1,4,2,5,3,6]这样但没有结果的东西。

2 个答案:

答案 0 :(得分:4)

我们可以使用word包中的stringr函数,该函数根据给定的位置从句子中提取单词。

library(stringr)    
word(ms, c(1,4,2,5,3,6))

#[1] "DC,"   "Wash," "MD,"   "Balt," "MA,"   "Bos"  

如果我们需要将它们作为单个字符串返回,我们可以使用paste

将它们包裹在collapse = ""
paste(word(ms, c(1,4,2,5,3,6)), collapse = "")

#[1] "DC,Wash,MD,Balt,MA,Bos"

答案 1 :(得分:3)

如果我们有自定义订单,则拆分字符串,订购,然后将paste内容合并在一起

toString(strsplit(ms, ",\\s*")[[1]][c(1, 4, 2, 5, 3, 6)])
#[1] "DC, Wash, MD, Balt, MA, Bos"

如果字符串中的单词数量较少,即通过捕获为一组,然后在替换为gsub时重新排列后向引用,也可以执行此操作。一旦有更多单词

,这就变得很麻烦
gsub("^(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+)$", 
                   "\\1, \\4, \\2, \\5, \\3, \\6", ms)

更新

通过OP的帖子中的新例子,目前尚不清楚索引模式的一般情况

v1 <- strsplit(ms, ",\\s*")[[1]]
toString(v1[c(1, 4, 2, 5, 3, 6, 7:length(v1))])
#[1] "DC, Wash, MD, Balt, MA, Bos, x, y, z"

如果只重新排列前6个单词,那么可以将其排列在gsub

之内,而不是拆分整个字符串。
gsub("^(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+),\\s+(\\w+)(.*)$", 
         "\\1, \\4, \\2, \\5, \\3, \\6\\7", ms)
#[1] "DC, Wash, MD, Balt, MA, Bos, x, y, z"

在这里,我们捕获大括号内的单词((\\w+)),反向引用查找捕获的组的顺序。即\\1将是第一个被捕获的组,\\4是第四个被捕获的组,依此类推。最后一个(\\7)的反向引用将包括第6个单词之后的所有其他字符。