我正在尝试自学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"
答案 0 :(得分:48)
从?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"
答案 1 :(得分:29)
stringi
已经有这个功能很长一段时间了:
stringi::stri_reverse("abcdef")
## [1] "fedcba"
还要注意它的矢量化:
stringi::stri_reverse(c("a", "ab", "abc"))
## [1] "a" "ba" "cba"
答案 2 :(得分:20)
正如@mplourde指出的那样,你需要collapse
参数:
paste(test_rev, collapse='')
R中的大多数命令都是矢量化的,但命令处理矢量的确切程度取决于命令。 paste
将对多个向量进行操作,并将每个向量的i
元素组合在一起:
> paste(letters[1:5],letters[1:5])
[1] "a a" "b b" "c c" "d d" "e e"
collapse
告诉它在矢量中操作。
答案 3 :(得分:10)
以下可以是一种有用的方法来反转字符串x
的向量,并且稍微快一点(并且内存效率更高),因为它避免了生成列表(如使用strsplit
):< / p>
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)
答案 4 :(得分:10)
您也可以使用IRanges
包。
library(IRanges)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"
您也可以使用Biostrings
包。
library(Biostrings)
x <- "ATGCSDS"
reverse(x)
# [1] "SDSCGTA"
答案 5 :(得分:6)
如果您的数据位于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
答案 6 :(得分:3)
这是一个函数,它返回整个反向字符串,或者可选地反向字符串,只保留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"
答案 7 :(得分:2)
以下代码将从用户获取输入并反转整个字符串 -
revstring=function(s)
print(paste(rev(strsplit(s,"")[[1]]),collapse=""))
str=readline("Enter the string:")
revstring(str)
答案 8 :(得分:1)
以下是gsub
的解决方案。虽然我同意使用strsplit
和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"
答案 9 :(得分: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"))
}
答案 10 :(得分:1)
反转字符串的最简单方法:
#reverse string----------------------------------------------------------------
revString <- function(text){
paste(rev(unlist(strsplit(text,NULL))),collapse="")
}
#example:
revString("abcdef")
答案 11 :(得分:1)
这是另一个基础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"
解决方案的灵感来自these U. Auckland slides。
答案 12 :(得分:1)
您可以使用上一篇文章中提到的rev()函数。
`X <- "MyString"
RevX <- paste(rev(unlist(strsplit(X,NULL))),collapse="")
输出:&#34; gnirtSyM&#34;
谢谢,
答案 13 :(得分:0)
显然,前端JS开发人员被要求在JS中执行此操作(用于访谈),而不使用内置的反向功能。我花了几分钟,但我想出了:
string <- 'hello'
foo <- vector()
for (i in nchar(string):1) foo <- append(foo,unlist(strsplit(string,''))[i])
paste0(foo,collapse='')
所有这些都可以包含在函数中......
高阶函数怎么样?降低?