2012-03-14 12 views
55

¿Cómo elimino parte de una picadura? como ATGAS_1121. Para este ejemplo, quiero eliminar todo antes de _R quitar parte de la cadena

¿Alguien me puede ayudar? ¡Gracias!

Respuesta

89

Use 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 el guión bajo (_) (.). Los ? hace que el partido sea "flojo" para que solo coincida con el primer guión bajo. Ese partido se reemplaza con solo un guion bajo. Ver ?regex para más detalles y referencias

+5

La expresión regular anterior coincidiría con el último guión bajo en el caso de, por ejemplo, 'gsub (" ^. * _ "," _ "," ATGAS_1121_xxx ")'. Ahora arreglado. –

+2

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

+0

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

26

Se puede utilizar un incorporado para esto, strsplit:

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

strsplit vuelve ambos piezas de la cadena analizada en el dividida parámetro como lista. Probablemente eso no es lo que quiere, así que ajuste la llamada en unlist, luego índice esa matriz para que solo se devuelva el segundo de los dos elementos en el vector.

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

13

Aquí está la solución de strsplit si s es 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 cuerda (es decir, antes del '_'), reemplace [2] en el extremo con un [1]. – stevenjoe

3

Aquí la solución strsplit para una trama de datos utilizando dplyr paquete

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 
5

Si usted es una clase Tidyverse de la persona, aquí está el stringr solución:

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" 
Cuestiones relacionadas