Recupero e rimozione del primo carattere di una stringa


102

Vorrei fare alcune passeggiate bidimensionali usando stringhe di caratteri assegnando valori diversi a ciascun personaggio. Avevo intenzione di "scoppiare" il primo carattere di una stringa, usarlo e ripetere per il resto della stringa.

Come posso ottenere qualcosa di simile?

x <- 'hello stackoverflow'

Mi piacerebbe essere in grado di fare qualcosa del genere:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'

Risposte:


167

Vedi ?substring.

x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"

L'idea di avere un popmetodo che restituisca un valore e abbia un effetto collaterale sull'aggiornamento dei dati archiviati xè un concetto della programmazione orientata agli oggetti. Quindi, invece di definire una popfunzione per operare su vettori di caratteri, possiamo creare una classe di riferimento con un popmetodo.

PopStringFactory <- setRefClass(
  "PopString",
  fields = list(
    x = "character"  
  ),
  methods = list(
    initialize = function(x)
    {
      x <<- x
    },
    pop = function(n = 1)
    {
      if(nchar(x) == 0)
      {
        warning("Nothing to pop.")
        return("")
      }
      first <- substring(x, 1, n)
      x <<- substring(x, n + 1)
      first
    }
  )
)

x <- PopStringFactory$new("hello stackoverflow")
x
## Reference class object of class "PopString"
## Field "x":
## [1] "hello stackoverflow"
replicate(nchar(x$x), x$pop())
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w"

15

C'è anche str_subdal pacchetto stringr

x <- 'hello stackoverflow'
str_sub(x, 2) # or
str_sub(x, 2, str_length(x))
[1] "ello stackoverflow"

10

Usa questa funzione dal stringipacchetto

> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"

8

substringè decisamente il migliore, ma ecco strsplitun'alternativa, dato che non ne ho ancora vista una.

> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"

o equivalentemente

> unlist(strsplit(x, ''))[1]
## [1] "h"

E puoi pasterimettere insieme il resto della stringa.

> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"

5

rimuovere i primi caratteri:

x <- 'hello stackoverflow'
substring(x, 2, nchar(x))

L'idea è selezionare tutti i caratteri a partire da 2 fino al numero di caratteri in x. Questo è importante quando hai un numero di caratteri ineguale nella parola o nella frase.

La selezione della prima lettera è banale come le risposte precedenti:

substring(x,1,1)

2

Un'altra alternativa è usare l'acquisizione di sottoespressioni con le funzioni delle espressioni regolari regmatchese regexec.

# the original example
x <- 'hello stackoverflow'

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))

Questo restituisce l'intera stringa, il primo carattere e il risultato "saltato" in un elenco di lunghezza 1.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

che è equivalente a list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). Cioè, contiene il super set degli elementi desiderati e la stringa completa.


L'aggiunta sapplyconsentirà a questo metodo di funzionare per un vettore di caratteri di lunghezza> 1.

# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))

Ciò restituisce un elenco con la stringa completa corrispondente come primo elemento e le sottoespressioni corrispondenti catturate da ()come i seguenti elementi. Quindi '(^.)(.*)', nell'espressione regolare , (^.)corrisponde al primo carattere e (.*)corrisponde ai caratteri rimanenti.

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

[[2]]
[1] "right back" "r"          "ight back" 

[[3]]
[1] "at yah" "a"      "t yah" 

Ora possiamo usare il fidato sapply+ [metodo per estrarre le sottostringhe desiderate.

myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back"          "t yah"

Questo è un trucco molto carino, ma penso che manchi la domanda.
pedrosaurio

Dovrai spiegare ulteriormente in quanto può produrre lo stesso output delle altre risposte. Vedi l'ultimo blocco di codice che utilizza sapplyper l'estrazione. "scoppiare" il primo carattere, come specificato nella domanda, è una questione di ripetere questo processo sul vettore risultante (mySecondStrings).
lmo

Certo funziona con la spiegazione extra che hai appena aggiunto, ma la trovo ancora più contorta di quanto dovrebbe.
pedrosaurio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.