test regulares regexp probar online expresiones ejemplos ejemplo crear regex r split gsub

regexp - Dividir los valores en la columna usando expresiones regulares



regex replace online (3)

Tengo data.frame con dos columnas como la siguiente

dat ID Details id_1 box1_homodomain gn=box1 os=homo sapiens p=4 se=1 id_2 sox2_plurinet gn=plu os=mus musculus p=5 se=3

Me gustaría dividir el "os = xxx" y gn = "yyy" en la columna "Detalles" para todos los identificadores e imprimirlo de la siguiente manera:

Id Description gn os Îd_1 box1_homodomain box1 homo sapiens Id_2 sox2_plurinet plu mouse musculus

Intenté utilizar el enfoque gsub en R, pero no puedo dividir el os = homo sapiens y gn = box1 en sus respectivas columnas. El siguiente código R que utilicé

dat$gn=gsub(''^[gn=][A-z][A-z]`,dat$Details) dat$os=gsub(''^[os=][A-z][A-z]`,dat$Details)

¿Alguien puede decirme qué está mal y cómo se puede corregir? Amablemente ayúdame

Gracias por adelantado


Aquí hay una opción con tidyr:

library(tidyr) # specify the new column names: vars <- c("Description", "gn", "os") # then separate the "Details" column according to regex and drop extra columns: separate(dat, Details, into = vars, sep = "[A-Za-z]+=", extra = "drop") # ID Description gn os #1 id_1 box1_homodomain box1 homo sapiens #2 id_2 sox2_plurinet plu mus musculus


También puede hacer uso de grupos de captura de expresiones regulares para eso. Cada coincidencia de grupo de captura se puede extraer, por ejemplo, con la función stringi paquete stringi .

dat <- data.frame( ID=c("id_1", "id_2"), details=c("box1_homodomain gn=box1 os=homo sapiens p=4 se=1", "sox2_plurinet gn=plu os=mus musculus p=5 se=3") ) library(stringi) res <- stri_match_first_regex(dat$details, "^(.+) gn=(.+) os=(.+) p=.*$") res[,1] <- dat$ID res <- as.data.frame(res) names(res) <- c("ID", "Description", "gn", "os") res ## ID Description gn os ## 1 1 box1_homodomain box1 homo sapiens ## 2 2 sox2_plurinet plu mus musculus


1) sub y gsub Para hacerlo usando sub y gsub como en la pregunta prueba esto. Tenga en cuenta que cada expresión regular debe coincidir con todos los dat$Details para que cuando la reemplacemos con el grupo de captura solo quede el grupo de captura. Para el dat$GO como en los comentarios a la pregunta, eliminamos todo, pero no incluye P: reemplace todas las apariciones de ;P con una coma y elimine P: y también elimine el punto y coma y todo lo demás. Del mismo modo para F y C :

data.frame(dat[1], Description = sub(" .*", "", dat$Details), gn = sub(".*gn=(.*) os=.*", "//1", dat$Details), os = sub(".*os=(.*) p=.*", "//1", dat$Details), P = gsub("P:|;.*", "", gsub(";P:", ",", sub(".*?P:", "P:", dat$GO))), F = gsub("F:|;.*", "", gsub(";F:", ",", sub(".*?F:", "F:", dat$GO))), C = gsub("C:|;.*", "", gsub(";C:", ",", sub(".*?C:", "C:", dat$GO))))

dando:

ID Description gn os P F C 1 id_1 box1_homodomain box1 homo sapiens p_1,p_2 F_1 C_1,C_2 2 id_2 sox2_plurinet plu mus musculus p_1 F_1,F_2 C_1

2) read.pattern El procesamiento de dat$Details es un poco más fácil con read.pattern (link) en el paquete gsubfn ya que se puede definir una sola expresión regular cuyos grupos de captura representan los campos de interés. El procesamiento de dat$GO se puede simplificar también extrayendo los campos P:... usando strapplyc (enlace) y luego concatenándolos junto con paste (y de manera similar con los campos F y C ):

library(gsubfn) Sub <- function(string, pat) sapply(strapplyc(string, pat), paste, collapse = ",") DF <- read.pattern(text = as.character(dat$Details), pattern = "(.*) gn=(.*) os=(.*) p=", col.names = c("Description", "gn", "os"), as.is = TRUE) cbind(dat[1], DF, P = Sub(dat$GO, "P:(.*?);"), F = Sub(dat$GO, "F:(.*?);"), C = Sub(dat$GO, "C:(.*?);"))

dando:

ID Description gn os P F C 1 id_1 box1_homodomain box1 homo sapiens p_1,p_2 F_1 C_1,C_2 2 id_2 sox2_plurinet plu mus musculus p_1 F_1,F_2 C_1

Aquí hay una visualización de la expresión regular utilizada en read.pattern :

(.*) gn=(.*) os=(.*) p=

Demostración de Debuggex

Notas

1) Si la columna dat$Details ya es un carácter, podríamos omitir as.character . También podríamos omitir as.is=TRUE si está bien tener columnas de factor en el resultado.

2) la salida de muestra en la pregunta tiene mouse pero la entrada tiene mus . Supusimos que debería ser mus en ambos casos.

3) Lo usamos para dat :

dat <- structure(list(ID = c("id_1", "id_2"), Details = c("box1_homodomain gn=box1 os=homo sapiens p=4 se=1", "sox2_plurinet gn=plu os=mus musculus p=5 se=3"), GO = c("P:p_1;P:p_2;F:F_1;C:C_1;C:C_2; ", "P:p_1;F:F_1;F:F_2;C:C_1;")), .Names = c("ID", "Details", "GO"), class = "data.frame", row.names = c(NA, -2L))

En el futuro, publique el resultado del dput(dat) en la pregunta.