我有一个角色:
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]
这样但没有结果的东西。
答案 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个单词之后的所有其他字符。