52

I'm trying to teach myself R and in doing some sample problems I came across the need to reverse a string.

Here's what I've tried so far but the paste operation doesn't seem to have any effect.

There must be something I'm not understanding about lists? (I also don't understand why I need the [[1]] after 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"
4

14 回答 14

53

From ?strsplit,一个将反转字符串向量中的每个字符串的函数:

## a useful function: rev() for strings
strReverse <- function(x)
        sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
strReverse(c("abc", "Statistics"))
# [1] "cba"        "scitsitatS"
于 2012-11-28T19:46:07.183 回答
34

stringi这个功能用了很久了:

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

另请注意,它是矢量化的:

stringi::stri_reverse(c("a", "ab", "abc"))
## [1] "a"   "ba"  "cba"
于 2016-06-14T14:09:45.713 回答
21

正如@mplourde 指出的那样,您需要以下collapse论点:

paste(test_rev, collapse='')

R 中的大多数命令都是矢量化的,但命令处理矢量的准确程度取决于命令。 paste将对多个向量进行操作,结合i每个向量的第 th 个元素:

> paste(letters[1:5],letters[1:5])
[1] "a a" "b b" "c c" "d d" "e e"

collapse告诉它改为在向量内操作。

于 2012-11-28T19:43:08.613 回答
10

以下可能是反转字符串向量的有用方法x,并且速度稍快(并且内存效率更高),因为它避免了生成列表(如 using strsplit):

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

如果您知道您将使用 ASCII 字符并且速度很重要,那么有一个快速的 C 实现用于反转内置的字符串向量Kmisc

install.packages("Kmisc")
str_rev(x)
于 2012-12-25T08:31:43.333 回答
10

您也可以使用该IRanges软件包。

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

您也可以使用该Biostrings软件包。

library(Biostrings)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"
于 2014-02-26T12:14:38.033 回答
6

如果您的数据在 a 中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
于 2012-11-29T08:38:39.040 回答
4

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

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

首先,定义一个易于识别的字符串作为示例:

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

[1] "abcdefghijklmnopqrstuvwxyz"

现在尝试revString使用和不使用索引的函数:

revString(myString)

[1] "zyxwvutsrqponmlkjihgfedcba"

revString(myString, 1:5)

[1] "zyxwv"

于 2015-06-29T23:14:52.513 回答
3

您可以使用前一篇文章中提到的 rev() 函数。

`X <- "MyString"

RevX <- paste(rev(unlist(strsplit(X,NULL))),collapse="")

输出:“gnirtSyM”

谢谢,

于 2018-03-26T09:05:35.910 回答
1

这是一个解决方案gsub。尽管我同意使用strsplitand更容易paste(正如其他答案中所指出的那样),但看到它也适用于正则表达式可能会很有趣:

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"
于 2012-11-29T07:26:49.783 回答
1
##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"))
}
于 2015-05-06T04:41:19.963 回答
1

这是另一种 base-R 解决方案:

# 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"

解决方案的灵感来自这些 U.Auckland 幻灯片

于 2017-07-09T22:13:07.683 回答
1

反转字符串的最简单方法:

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

#example:
revString("abcdef")
于 2017-02-17T09:54:11.930 回答
1

以下代码将从用户那里获取输入并反转整个字符串-

revstring=function(s)
print(paste(rev(strsplit(s,"")[[1]]),collapse=""))

str=readline("Enter the string:")
revstring(str)
于 2017-10-16T15:14:04.023 回答
0

因此,显然前端 JS 开发人员被要求在 JS 中执行此操作(用于面试),而不使用内置的反向函数。我花了几分钟,但我想出了:

string <- 'hello'

foo <- vector()

for (i in nchar(string):1) foo <- append(foo,unlist(strsplit(string,''))[i])
paste0(foo,collapse='')

这一切都可以包装在一个函数中......

那么高阶泛函呢?减少?

于 2018-02-18T01:53:09.643 回答