varias superponer studio lineas graficos graficas r regex string extract bioinformatics

studio - superponer graficas en r



R extraer parte de la cadena (6)

Tengo una pregunta acerca de cómo extraer una parte de una cadena. Por ejemplo tengo una cadena como esta:

a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0"

Necesito extraer todo entre GN= y ; .Así que aquí será NOC2L .

¿Es eso posible?

Nota: Este es el formato de archivo VCF en forma de columna INFO . GN es el nombre del gen, por lo que queremos extraer el nombre del gen de la columna INFO .


Como la cadena proviene del archivo VCF, podemos usar el paquete VariantAnnotation :

library(VariantAnnotation) # read dummy VCF file fl <- system.file("extdata", "chr22.vcf.gz", package="VariantAnnotation") vcf <- readVcf(fl, "hg19") # see first 5 variables for info column info(vcf)[1:3, 1:5] # DataFrame with 3 rows and 5 columns # LDAF AVGPOST RSQ ERATE THETA # <numeric> <numeric> <numeric> <numeric> <numeric> # rs7410291 0.3431 0.9890 0.9856 2e-03 0.0005 # rs147922003 0.0091 0.9963 0.8398 5e-04 0.0011 # rs114143073 0.0098 0.9891 0.5919 7e-04 0.0008 # Now extract one column, e.g.: LDAF info(vcf)[1:3, "LDAF"] # [1] 0.3431 0.0091 0.0098

En el ejemplo anterior, el objeto VCF no tiene una columna "GN", pero la idea es la misma, por lo que en su caso, a continuación debería funcionar:

# extract gene name info(vcf)[, "GN"]


Como una alternativa a la combinación de referencias anteriores con sub , puede usar una aserción de mirar por detrás y mirar por delante con una operación de extracción, de esta manera:

library(stringr) a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0" str_extract(a, "(?<=GN=)[^;]*(?=;|$)") # [1] NOC2L

Dónde:

  • (?<=GN=) afirma que GN= debe estar antes del partido
  • (?=;|$) afirma ; o el final de la cadena ( $ ) debe estar detrás (después) de la coincidencia
  • [^;]* coincide con cualquier número de caracteres que no lo sean ;

Nota: [^;]* se utilizó sobre .* Ya que este último podría coincidir con a ; y continuar haciendo coincidir hasta el final de la cadena ( $ ).


Prueba esto:

sub(".*?GN=(.*?);.*", "//1", a) # [1] "NOC2L"


Suponiendo que los puntos y comas separan sus elementos, y los signos de igual se producen exclusivamente entre los pares clave / valor, un método no regex estrictamente sería:

bits <- unlist(strsplit(a, '';'')) do.call(rbind, strsplit(bits, ''='')) [,1] [,2] [1,] "DP" "26" [2,] "AN" "2" [3,] "DB" "1" [4,] "AC" "1" [5,] "MQ" "56" [6,] "MZ" "0" [7,] "ST" "5:10,7:2" [8,] "CQ" "SYNONYMOUS_CODING" [9,] "GN" "NOC2L" [10,] "PA" "1^1:0.720&2^1:0"

Entonces solo es cuestión de seleccionar el elemento apropiado.


Una forma sería:

gsub(".+=(//w+);.+", "//1", a, perl=T)

Estoy seguro de que hay formas más elegantes de hacerlo.


a <- "DP=26;AN=2;DB=1;AC=1;MQ=56;MZ=0;ST=5:10,7:2;CQ=SYNONYMOUS_CODING;GN=NOC2L;PA=1^1:0.720&2^1:0" m = regexpr("GN.*;",a) substr(a,m+3,m+attr(m,"match.length")-2)