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 queGN=
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)