问题
I'd like to change the word order for each element in a vector. Specifically I'd like to make another vector where the first word is now the last word for a number of elements that differ in length.
Data
metadata1 <- c("reference1 an organism",
"reference2 another organism here",
"reference3 yet another organism is here")
Desired outcome
metadata2 <- c("an organism reference1",
"another organism here reference2",
"yet another organism is here reference3")
My attempt
metadata2 <- lapply(strsplit(metadata1," "), function(x) paste(x[c(2,3,4,5,1)]))
I've tried to use lapply() to separate each element by spaces using strsplit(), and then paste them back together using the order index. This gets the words in the right order, but returns a list where the words are separate elements and because some elements are longer than others I get "NA"s when an index number is higher than the number of words in that element. I've also tried sapply() which returns a matrix and tapply() which does not work.
回答1:
library(stringr)
paste(word(metadata1,2, -1), word(metadata1,1), sep = " ")
# [1] "an organism reference1"
# [2] "another organism here reference2"
# [3] "yet another organism is here reference3"
# OR
sapply(metadata1, function(x){ y = unlist(strsplit(x, " "))
paste(c(y[-1],y[1]),collapse = " ")
})
# OR ( this is purely @Frank's answer)( Shall remove when he puts it as an answer)
sub("^(\\w+) (.*)$", "\\2 \\1", metadata1)
来源:https://stackoverflow.com/questions/42009315/reorder-words-in-each-element-of-a-vector