Comment inverser une chaîne en R

J’essaie de m’apprendre R et, en faisant quelques exemples de problèmes, j’ai découvert la nécessité d’inverser une chaîne.

Voici ce que j’ai essayé jusqu’ici mais l’opération de collage ne semble pas avoir d’effet.

Il doit y avoir quelque chose que je ne comprends pas sur les listes? (Je ne comprends pas non plus pourquoi j’ai besoin du [[1]] après strsplit.)

> test  test [1] "g" "r" "e" "g" > test_rev  test_rev [1] "g" "e" "r" "g" > paste(test_rev) [1] "g" "e" "r" "g" 

Comme @mplourde le souligne, vous voulez l’argument de réduction:

 paste(test_rev, collapse='') 

La plupart des commandes de R sont vectorisées, mais la manière dont la commande gère les vecteurs dépend de la commande. paste fonctionnera sur plusieurs vecteurs, en combinant le iième élément de chacun:

 > paste(letters[1:5],letters[1:5]) [1] "aa" "bb" "cc" "dd" "ee" 

collapse indique de fonctionner dans un vecteur à la place.

De ?strsplit , une fonction qui inverse chaque chaîne dans un vecteur de chaînes:

 ## a useful function: rev() for ssortingngs strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse="") strReverse(c("abc", "Statistics")) # [1] "cba" "scitsitatS" 

ssortingngi a cette fonction depuis longtemps:

 ssortingngi::ssorting_reverse("abcdef") ## [1] "fedcba" 

Notez également que c’est vectorisé:

 ssortingngi::ssorting_reverse(c("a", "ab", "abc")) ## [1] "a" "ba" "cba" 

Ce qui suit peut être un moyen utile d’inverser un vecteur de chaînes x , et est légèrement plus rapide (et plus efficace en strsplit mémoire) car cela évite de générer une liste (comme dans strsplit ):

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

Si vous savez que vous allez travailler avec des caractères ASCII et que la vitesse est importante, il existe une implémentation C rapide pour inverser un vecteur de chaînes intégré à Kmisc :

 install.packages("Kmisc") str_rev(x) 

Vous pouvez également utiliser le package IRanges .

 library(IRanges) x <- "ATGCSDS" reverse(x) # [1] "SDSCGTA" 

Vous pouvez également utiliser le package Biossortingngs .

 library(Biossortingngs) x <- "ATGCSDS" reverse(x) # [1] "SDSCGTA" 

Si vos données sont dans un data.frame , vous pouvez utiliser sqldf :

 mySsortingngs <- 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 

Voici une fonction qui retourne toute la chaîne inversée, ou éventuellement la chaîne inverse en ne gardant que les éléments spécifiés par index , en comptant à partir du dernier caractère.

 revSsortingng = function(ssortingng, index = 1:nchar(ssortingng)){ paste(rev(unlist(strsplit(ssortingng, NULL)))[index], collapse = "") } 

Tout d’abord, définissez une chaîne facilement reconnaissable comme exemple:

(mySsortingng <- paste(letters, collapse = ""))

[1] "abcdefghijklmnopqrstuvwxyz"

Maintenant, essayez la fonction revSsortingng avec et sans l'index:

revSsortingng(mySsortingng)

[1] "zyxwvutsrqponmlkjihgfedcba"

revSsortingng(mySsortingng, 1:5)

[1] "zyxwv"

Voici une solution avec gsub . Bien que je reconnaisse que c’est plus facile avec strsplit et paste (comme indiqué dans les autres réponses), il peut être intéressant de voir que cela fonctionne aussi avec les expressions régulières:

 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")) } 

La manière la plus simple d’inverser la chaîne:

 #reverse ssortingng---------------------------------------------------------------- revSsortingng <- function(text){ paste(rev(unlist(strsplit(text,NULL))),collapse="") } #example: revString("abcdef") 

Voici une autre solution de 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" 

La solution a été inspirée par ces diapositives U. Auckland .

Le code suivant prendra l’entrée de l’utilisateur et inversera la chaîne entière.

 revssortingng=function(s) print(paste(rev(strsplit(s,"")[[1]]),collapse="")) str=readline("Enter the ssortingng:") revssortingng(str) 

Vous pouvez faire avec la fonction rev () comme mentionné dans un article précédent.

 `X <- "MyString" 

RevX <- paste(rev(unlist(strsplit(X,NULL))),collapse="")

Sortie: "gnirtSyM"

Merci,

Donc, apparemment, les développeurs JS frontaux sont invités à le faire (pour des interviews) dans JS sans utiliser les fonctions inversées intégrées. Cela m’a pris quelques minutes, mais j’ai trouvé:

 ssortingng <- 'hello' foo <- vector() for (i in nchar(string):1) foo <- append(foo,unlist(strsplit(string,''))[i]) paste0(foo,collapse='') 

Que tout pourrait être enveloppé dans une fonction ...

Qu'en est-il des fonctionnels d'ordre supérieur? Réduire?