Pregunta extraer una subcadena en R de acuerdo con un patrón


Supongamos que tengo una lista de cadenas: string = c("G1:E001", "G2:E002", G3:E003). Ahora espero obtener un vector de cadena que contenga solo las partes después del colon ":", es decir substring = c(E001,E002,E003). ¿Hay una manera conveniente en R para hacer esto? Utilizando substr? ¡Gracias!


75
2018-06-20 14:06


origen


Respuestas:


Aquí hay algunas maneras:

1) sub

sub(".*:", "", string)
## [1] "E001" "E002" "E003"

2) strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"

3) read.table

read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"

4) subcadena

Esto supone que la segunda parte siempre comienza en el cuarto carácter (que es el caso en el ejemplo de la pregunta):

substring(string, 4)
## [1] "E001" "E002" "E003"

4a) subcadena / expresión regular 

Si los dos puntos no estuvieran siempre en una posición conocida, podríamos modificar (4) buscándolo:

substring(string, regexpr(":", string) + 1)

5) strapplyc

strapplyc devuelve la parte entre paréntesis:

library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"

6) read.dcf 

Este solo funciona si las subcadenas anteriores al colon son únicas (que están en el ejemplo de la pregunta). También requiere que el separador sea dos puntos (que está en la pregunta). Si se usara un separador diferente, entonces podríamos usar sub para reemplazarlo con dos puntos primero. Por ejemplo, si el separador fuera _ entonces string <- sub("_", ":", string)

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"

ADICIONAL. strapplyc y read.dcf soluciones.

NOTA.

La entrada string se supone que es:

string <- c("G1:E001", "G2:E002", "G3:E003")

133
2018-06-20 14:10



Por ejemplo usando gsub o sub

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"

17
2018-06-20 14:10



Aquí hay otra respuesta simple

gsub("^.*:","", string)

9
2018-04-21 19:49



Esto debería hacer:

gsub("[A-Z][1-9]:", "", string)

da

[1] "E001" "E002" "E003"

4
2018-06-20 14:10