如何在R中反转字符串

Gre*_*reg 45 r

我正在尝试自学R并且在做一些示例问题时遇到了需要反转字符串的问题.

这是我到目前为止所尝试的,但粘贴操作似乎没有任何影响.

必须有一些我不了解列表的东西?(我也不明白为什么在strsplit之后我需要[[1]].)

> 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"
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 50

?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"
Run Code Online (Sandbox Code Playgroud)

  • 很好,相同的功能重写了dplyr/[magrittr](https://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html)方式以便于阅读`strreverse < - function(x){strsplit( x,NULL)%>%lapply(rev)%>%sapply(paste,collapse ="")}`. (3认同)

gag*_*ews 30

stringi 已经有这个功能很长一段时间了:

stringi::stri_reverse("abcdef")
## [1] "fedcba"
Run Code Online (Sandbox Code Playgroud)

还要注意它的矢量化:

stringi::stri_reverse(c("a", "ab", "abc"))
## [1] "a"   "ba"  "cba"
Run Code Online (Sandbox Code Playgroud)


Ari*_*man 20

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

paste(test_rev, collapse='')
Run Code Online (Sandbox Code Playgroud)

R中的大多数命令都是矢量化的,但命令处理向量的确切程度取决于命令. paste将在多个向量上运行,结合i每个向量的元素:

> paste(letters[1:5],letters[1:5])
[1] "a a" "b b" "c c" "d d" "e e"
Run Code Online (Sandbox Code Playgroud)

collapse 告诉它在矢量中操作.


Kev*_*hey 10

以下是反转字符串向量的有用方法x,并且稍微快一点(并且内存效率更高),因为它避免生成列表(如在使用中strsplit):

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

如果你知道你将使用ASCII字符和速度问题,那么有一个快速的C实现可以反转内置的字符串向量Kmisc:

install.packages("Kmisc")
str_rev(x)
Run Code Online (Sandbox Code Playgroud)


Ven*_*Yao 10

您也可以使用该IRanges包.

library(IRanges)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"
Run Code Online (Sandbox Code Playgroud)

您也可以使用该Biostrings包.

library(Biostrings)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 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
Run Code Online (Sandbox Code Playgroud)