Quitar parte de una cuerda


90

¿Cómo elimino parte de una cuerda? Por ejemplo ATGAS_1121, quiero eliminar todo antes _.

Respuestas:


131

Usa expresiones regulares. En este caso, puede utilizar gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Esta expresión regular coincide con el comienzo de la cadena (^), cualquier carácter (.) Repetido cero o más veces (*) y guión bajo (_). Los ? hace que la coincidencia sea "perezosa" para que solo coincida con el primer guión bajo. Esa coincidencia se reemplaza con solo un guión bajo. Consulte ?regexpara obtener más detalles y referencias


6
Texto anterior coincidiría con el último guión bajo en el caso de, por ejemplo, gsub("^.*_","_","ATGAS_1121_xxx"). Ahora arreglado.
Richie Cotton

7
@Joshua Me parece realmente útil que hayas explicado el papel de las expresiones regulares.
Vasile

Esto también funciona con un vector de cadenas como último argumento. R es increíble así.
naught101

37

Puede usar una función incorporada para esto, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit devuelve ambas partes de la cadena analizada en el parámetro split como una lista . Probablemente eso no sea lo que desea, así que envuelva la llamada en unlist , luego indexe esa matriz para que solo se devuelva el segundo de los dos elementos en el vector.

Finalmente, el parámetro fijo debe establecerse en VERDADERO para indicar que el parámetro de división no es una expresión regular, sino un carácter coincidente literal.


23

Si eres del tipo de persona de Tidyverse, aquí tienes la solución de cadena :

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

Aquí está la strsplitsolución si ses un vector:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
¡Muy útil, gracias! FYI para obtener la primera parte de la cadena (es decir, antes del '_'), reemplace el [2] al final con un [1].
stevenjoe

4

Quizás la solución más intuitiva probablemente sea usar la stringrfunción, str_removeque es incluso más fácil, str_replaceya que solo tiene 1 argumento en lugar de 2.

La única parte complicada de su ejemplo es que desea mantener el guión bajo, pero es posible: debe hacer coincidir la expresión regular hasta que encuentre el patrón de cadena especificado (?=pattern).

Ver ejemplo:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

Aquí la strsplitsolución para un marco de datos usando el dplyrpaquete

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.