Cómo eliminar los últimos n caracteres de cada elemento en el vector R

106

Soy muy nuevo en R y no pude encontrar un ejemplo simple en línea de cómo eliminar los últimos n caracteres de cada elemento de un vector (¿matriz?)

Vengo de un entorno de Java, así que lo que me gustaría hacer es iterar sobre cada elemento a$datay eliminar los últimos 3 caracteres de cada elemento.

¿Cómo lo harías?

LucasSeveryn
fuente

Respuestas:

115

He aquí un ejemplo de lo que haría. Espero que sea lo que estás buscando.

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

a debería contener ahora:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4
nfmcclure
fuente
Curiosamente, he tenido que cambiar -3a -0conseguir el efecto deseado! Tengo una gran cantidad de datos con fechas, como: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- sí, dos zonas horarias juntas, y la función as.Date está devolviendo resultados inesperados (el día anterior para las fechas BST); por lo tanto, quería eliminar la marca de la zona horaria, resulta que tengo que hacer -0y desaparece, junto con las horas
LucasSeveryn
Considere también la función strptime, aunque no he usado zonas horarias antes. Creo que podría reconocerlo. Supuestamente "% Z" reconoce zonas horarias. También eliminé la función sapply. Olvidé cuánto le gusta a R vectorizar sus funciones.
nfmcclure
@LucasSeveryn Si desea convertir representaciones de tiempo de caracteres a fechas teniendo en cuenta las zonas horarias, edítelo en su pregunta. Es probable que haya mejores respuestas que lo llevarán directamente a los resultados deseados (como strptime).
Blue Magister
84

He aquí una forma con gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
Matthew Plourde
fuente
4
(+1) Gran fan de las expresiones regulares. Se puede utilizar en casi todo.
Rich Scriven
8
Nota: Esto devuelve la cadena original si es más larga que el número de caracteres para cortar. Considere gsub('.{5}$', '', 'abcd').
Tomas Greif
32

Aunque esto es casi lo mismo con la respuesta de @nfmcclure, prefiero usar el stringrpaquete ya que proporciona un conjunto de funciones cuyos nombres son más consistentes y descriptivos que los de la base R (de hecho, siempre busco en Google "cómo obtener el número de caracteres en R " ya que no recuerdo el nombre nchar()).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

Esto elimina los últimos 3 caracteres de cada valor en la Speciescolumna.

Blaszard
fuente
22
con el stringrpaquete hay una solución aún más simple: str_sub(iris$Species, end=-4)
jan-glx
14

Lo mismo se puede lograr con el paquete stringi :

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 
gagolews
fuente
3

Similar a @Matthew_Plourde usando gsub

Sin embargo, usando un patrón que recortará a cero caracteres, es decir, devolverá "" si la cadena original es más corta que la cantidad de caracteres a cortar:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

La diferencia es que el {0,3}cuantificador indica de 0 a 3 coincidencias, mientras que {3}requiere exactamente 3 coincidencias; de lo contrario, no se encuentra ninguna coincidencia, en cuyo caso gsubdevuelve la cadena original sin modificar.

NB usar {,3}sería equivalente a {0,3}, simplemente prefiero la última notación.

Consulte aquí para obtener más información sobre los cuantificadores de expresiones regulares: https://www.regular-expressions.info/refrepeat.html

krads
fuente
Puede usar en sub()lugar de gsub().
sindri_baldur hace