如何在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。 虽然我同意使用strsplit
和paste
更容易(正如其他答案中指出的那样),但是也可以看到它也适用于正则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)