1
votes

Comment inverser une chaîne sans affecter les nombres dans R?

Je veux inverser une chaîne mais sans affecter les nombres. Par exemple:

input: "abcdef 123" sortie: "fedcba 123"

pour le moment j'utilise cette fonction que j'ai trouvée ici mais cela affecte tous les caractères:

name<-sapply(strsplit(name, split = ""),
           function(str) {paste(rev(str), collapse = "")})


0 commentaires

3 Réponses :


0
votes

Voici une solution:

Cas 1:

a <- "abc def 123"

# split the string
split_a <- unlist(strsplit(a, " "))

# removing the last word
to_split <- split_a[-length(split_a)]

reversed <- paste(sapply(lapply(strsplit(to_split, NULL), rev), paste, collapse=''), collapse=' ')

final <- paste(reversed, split_a[length(split_a)], collapse=" ")

[1] "cba fed 123"

Cas 2:

XXX


6 commentaires

Merci, c'est utile, mais avez-vous une idée de le faire fonctionner avec des chaînes contenant plus de deux mots?


Exemple @DanBoguslavsky?


entrée: abc def 123 sortie: cba fed 123


@DanBoguslavsky oui, en l'ajoutant dans un moment.


Cela semble fonctionner la plupart du temps mais @MichaelChirico est vraiment plus fiable que l'emplacement du mot numérique, même si j'ai donné l'exemple spécifique donc c'est mon mauvais aussi. Merci beaucoup de toute façon. j'apprécie beaucoup!


Je le crois aussi. J'ai aussi appris quelque chose de son approche.



1
votes

Une solution robuste:

name = c("abcdef 123", 'abc def 123', 'abc 123 def')
str_rev
# [1] "fedcba 123"  "cba fed 123" "cba 123 fed"

Cela permet d'appliquer la règle dans des cas plus généraux où vous ne savez pas où le "mot" numérique apparaîtra et au nom en tant que vecteur:

# convert vector of strings into list of vectors of words
words = strsplit(name, ' ', fixed = TRUE)

str_rev = sapply(words, function(x) {
  # we know some warnings may be created, ignore them
  suppressWarnings({
    is_num = !is.na(as.numeric(x))
  })

  # reverse non-numeric elements
  str_words = strsplit(x[!is_num], "", fixed = TRUE)
  x[!is_num] = sapply(str_words, function(y) {
    paste(rev(y), collapse = "")
  })
  paste(x, collapse = ' ')
})


0 commentaires

1
votes

Voici une option qui utilise stri_reverse de stringi

name <- c("abcdef 123", 'abc def 123', 'abc 123 def')

Ou comme @G. Grothendieck a mentionné, l'appel de fonction anonyme peut être supprimé

gsubfn("([^0-9 ]+)", stri_reverse, name)

data

library(stringi)
library(gsubfn)
gsubfn("([^0-9 ]+)", ~ stri_reverse(x), name)
#[1] "fedcba 123"  "cba fed 123" "cba 123 fed"


1 commentaires

Petit point mais notez que le deuxième argument pourrait être raccourci: gsubfn ("([^ 0-9] +)", stri_reverse, name)