52

私は自分自身に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"
4

14 に答える 14

53

から?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のほとんどのコマンドはベクトル化されていますが、コマンドがベクトルを正確に処理する方法はコマンドによって異なります。 それぞれのth要素をpaste組み合わせて、複数のベクトルに対して動作します。i

> 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あり、リストの生成を回避するため(を使用する場合のように)、わずかに高速です(そしてメモリ効率が高くなります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

データがにある場合は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です。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"
于 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

文字列を逆にする最も簡単な方法:

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

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

もう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.オークランドのスライドに触発されました。

于 2017-07-09T22:13:07.683 に答える
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 に答える