我正在尝试自学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)
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)
如果您的数据在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)