如何在R中反转string

我试图教自己R和在做一些样本问题,我遇到需要扭转一个string。

这是我迄今为止所尝试的,但粘贴操作似乎没有任何影响。

必须有一些我不明白的名单? (我也不明白为什么我需要[[1]]在strsplit之后。)

> test <- strsplit("greg", NULL)[[1]] > test [1] "g" "r" "e" "g" > test_rev <- rev(test) > test_rev [1] "g" "e" "r" "g" > paste(test_rev) [1] "g" "e" "r" "g" 

正如@mplourde指出的那样,你需要collapse参数:

 paste(test_rev, collapse='') 

R中的大多数命令都是vector化的,但是命令处理vector的方式取决于命令。 paste将在多个向量上运行,结合每个元素的第i个元素:

 > paste(letters[1:5],letters[1:5]) [1] "aa" "bb" "cc" "dd" "ee" 

collapse告诉它在vector内运行。

?strsplit ,一个函数,将反转string的向量中的每个string:

 ## a useful function: rev() for strings strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse="") strReverse(c("abc", "Statistics")) # [1] "cba" "scitsitatS" 

stringi已经有这个function相当长的时间:

 stringi::stri_reverse("abcdef") ## [1] "fedcba" 

还要注意,它是vector化的:

 stringi::stri_reverse(c("a", "ab", "abc")) ## [1] "a" "ba" "cba" 

您也可以使用IRanges软件包。

 library(IRanges) x <- "ATGCSDS" reverse(x) # [1] "SDSCGTA" 

您也可以使用Biostrings软件包。

 library(Biostrings) x <- "ATGCSDS" reverse(x) # [1] "SDSCGTA" 

下面是一个有用的方法来反转stringx的向量,并且稍微快一些(并且更高的内存效率),因为它避免了生成列表(如使用strsplit ):

 x <- rep( paste( collapse="", LETTERS ), 100 ) str_rev <- function(x) { sapply( x, function(xx) { intToUtf8( rev( utf8ToInt( xx ) ) ) } ) } str_rev(x) 

如果您知道您将要使用ASCII字符并加快速度,那么有一个快速的C实现来反转构build到Kmisc的string向量:

 install.packages("Kmisc") str_rev(x) 

如果您的数据在data.frame ,则可以使用sqldf

 myStrings <- data.frame(forward = c("does", "this", "actually", "work")) library(sqldf) sqldf("select forward, reverse(forward) `reverse` from myStrings") # forward reverse # 1 does seod # 2 this siht # 3 actually yllautca # 4 work krow 

这里是一个返回整个反转string的函数,或者可选地只保留由index指定的元素的反向string,从最后一个字符开始向后计数。

 revString = function(string, index = 1:nchar(string)){ paste(rev(unlist(strsplit(string, NULL)))[index], collapse = "") } 

首先,定义一个容易识别的string作为示例:

(myString <- paste(letters, collapse = ""))

[1] "abcdefghijklmnopqrstuvwxyz"

现在尝试带和不带索引的函数revString

revString(myString)

[1] "zyxwvutsrqponmlkjihgfedcba"

revString(myString, 1:5)

[1] "zyxwv"

这是一个使用gsub的解决scheme。 虽然我同意使用strsplitpaste更容易(正如其他答案中指出的那样),但是也可以看到它也适用于正则expression式:

 test <- "greg" n <- nchar(test) # the number of characters in the string gsub(paste(rep("(.)", n), collapse = ""), paste("", seq(n, 1), sep = "\\", collapse = ""), test) # [1] "gerg" 
 ##function to reverse the given word or sentence reverse <- function(mystring){ n <- nchar(mystring) revstring <- rep(NA, n) b <- n:1 c <- rev(b) for (i in 1:n) { revstring[i] <- substr(mystring,c[(n+1)- i], b[i]) } newrevstring <- paste(revstring, sep = "", collapse = "") return (cat("your string =", mystring, "\n", ("reverse letters = "), revstring, "\n", "reverse string =", newrevstring,"\n")) } 

反转string的最简单的方法是:

 #reverse string---------------------------------------------------------------- revString <- function(text){ paste(rev(unlist(strsplit(text,NULL))),collapse="") } #example: revString("abcdef") 

这里是另一个base-R解决scheme:

 # Define function strrev <- function(x) { nc <- nchar(x) paste(substring(x, nc:1, nc:1), collapse = "") } # Example strrev("Sore was I ere I saw Eros") [1] "sorE was I ere I saw eroS" 

解决scheme受到这些美国奥克兰幻灯片的启发。

以下代码将从用户接收input并反转整个string –

 revstring=function(s) print(paste(rev(strsplit(s,"")[[1]]),collapse="")) str=readline("Enter the string:") revstring(str)