Pregunta Obtener y eliminar el primer carácter de una cadena


Me gustaría hacer caminatas bidimensionales utilizando cadenas de caracteres asignando valores diferentes a cada personaje. Estaba planeando 'explotar' el primer carácter de una cuerda, usarlo y repetirlo por el resto de la cuerda.

¿Cómo puedo lograr algo como esto?

x <- 'hello stackoverflow'

Me gustaría poder hacer algo como esto:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'

74
2017-10-11 08:55


origen


Respuestas:


Ver ?substring.

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

La idea de tener un pop método que devuelve un valor y tiene un efecto secundario de actualizar los datos almacenados en x es en gran medida un concepto de programación orientada a objetos. Entonces, en lugar de definir un pop función para operar en vectores de caracteres, podemos hacer una clase de referencia con un pop método.

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"

122
2017-10-11 09:08



Use esta función de stringi paquete

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

8
2018-03-14 09:41



substring es definitivamente el mejor, pero aquí hay uno strsplit alternativa, ya que no he visto uno todavía.

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

o equivalente

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

Y tu puedes paste el resto de la cuerda vuelve a estar juntos.

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

6
2018-05-13 16:31



También hay str_sub del paquete stringr

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

4
2018-05-25 11:37



eliminando los primeros caracteres:

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

Idea es seleccionar todos los caracteres empezando desde 2 hasta el número de caracteres en x. Esto es importante cuando tiene una cantidad desigual de caracteres en palabra o frase.

Seleccionar la primera letra es trivial como respuestas anteriores:

substring(x,1,1)

3
2018-05-13 14:22



Otra alternativa es usar sub-expresiones de captura con las funciones de expresión regular regmatches y regexec.

# the original example
x <- 'hello stackoverflow'

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

Esto devuelve la cadena completa, el primer carácter y el resultado "reventado" en una lista de longitud 1.

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

que es equivalente a list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x)))). Es decir, contiene el conjunto súper de los elementos deseados, así como la cadena completa.


Añadiendo sapply permitirá que este método funcione para un vector de caracteres de longitud> 1.

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

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

Esto devuelve una lista con la cadena completa coincidente como primer elemento y las subexpresiones coincidentes capturadas por () como los siguientes elementos. Entonces en la expresión regular '(^.)(.*)', (^.) coincide con el primer personaje y (.*) coincide con los caracteres restantes.

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

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

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

Ahora, podemos usar el fiel sapply + [ método para extraer las subcadenas deseadas.

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

1
2018-06-12 19:51