Necesito dividir una columna que contiene información en varias columnas.
Lo usaría, tstrsplit
pero el mismo tipo de información no está en el mismo orden entre las filas y necesito extraer el nombre de la nueva columna dentro de la variable. Importante saber: puede haber muchas piezas de información (campos para convertirse en nuevas variables) y no las conozco todas, por lo que no quiero una solución "campo por campo".
A continuación se muestra un ejemplo de lo que tengo:
library(data.table)
myDT <- structure(list(chr = c("chr1", "chr2", "chr4"), pos = c(123L,
435L, 120L), info = c("type=3;end=4", "end=6", "end=5;pos=TRUE;type=2"
)), class = c("data.table", "data.frame"), row.names = c(NA,-3L))
# chr pos info
#1: chr1 123 type=3;end=4
#2: chr2 435 end=6
#3: chr4 120 end=5;pos=TRUE;type=2
Y me gustaría obtener:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
¡La forma más directa de conseguir eso sería muy apreciada! ( Nota: no estoy dispuesto a seguir una forma dplyr / tidyr )
r
data.table
reshape
Cath
fuente
fuente
structure()
actualizado la respuesta para evitar este problema (2) Son caracteres a propósito ... Sentí que analizarlos correctamente sería difícil . y una pregunta separada parece que resolvió que aunque en su respuesta y voy a echar un vistazo y ver si puedo aprender algo nuevo.Supongo que sus datos provienen de un archivo VCF , si es así hay una herramienta dedicada para tales problemas: bcftools .
Creemos un archivo VCF de ejemplo para probar:
Ahora podemos usar bcftools . Aquí, como ejemplo, estamos subconjustando AF y DP de la columna INFO :
Consulte el manual para más opciones de consulta .
fuente
Podríamos dividir y
";"
luego cambiar de forma de ancho a largo, luego dividir nuevamente"="
y luego volver a cambiar de largo a ancho:Una versión mejorada / más legible:
fuente
Por ahora, logré obtener lo que quiero con el siguiente código:
Dos opciones para mejorar las líneas anteriores, gracias a @ A5C1D2H2I1M1N2O1R2T1 (que las dio en los comentarios):
. con un doble
cSplit
antes dedcast
:. con
cSplit
/trstrplit
y endcast
lugar dereshape
:fuente
cSplit
, así:cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
seguido detstrsplit
, seguido pordcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
opción doble :-)Así es como lo haría:
Creado el 29/11/2019 por el paquete reprex (v0.3.0)
fuente
eval(parse(text=...))
... pero gracias de todos modos por su respuestaparse
tiene una mala reputación porque a menudo se usa por una razón incorrecta, este es precisamente su caso de uso apropiado, yendo de cadena a código. Ha formateado el texto, pero no formateado para R, y ha nombrado listas, por lo que mi primera línea lo codifica para una lista R, cambiando "a; b" en "lista (a, b)". Luego lo evaluamos y hacemos una tabla con él.Puede usar llamadas separadas
sub
para cada campo extraído deseado, por ejemplo, paratype
:fuente