Eu preciso dividir uma coluna que contém informações em várias colunas.
Eu usaria, tstrsplit
mas o mesmo tipo de informação não está na mesma ordem entre as linhas e preciso extrair o nome da nova coluna dentro da variável. Importante saber: pode haver muitas informações (campos para se tornarem novas variáveis) e eu não conheço todas elas, por isso não quero uma solução "campo por campo".
Abaixo está um exemplo do que tenho:
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
E eu gostaria de obter:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Uma maneira mais simples de conseguir isso seria muito apreciada! ( Nota: não estou disposto a seguir o caminho dplyr / tidyr )
r
data.table
reshape
Cath
fonte
fonte
structure()
Eu atualizei a resposta para evitar esse problema (2) Eles são caracteres de propósito ... Eu senti que analisá-los corretamente seria uma tarefa difícil e uma pergunta em separado.Parece que você resolveu isso na sua resposta e eu darei uma olhada e verei se consigo aprender algo novo #Suponho que seus dados são provenientes de um arquivo VCF , se houver, existe uma ferramenta dedicada para esses problemas - o bcftools .
Vamos criar um arquivo VCF de exemplo para teste:
Agora podemos usar o bcftools . Aqui, como exemplo, estamos configurando AF e DP da coluna INFO :
Veja o manual para mais opções de consulta .
fonte
Poderíamos dividir
";"
e remodelar de forma ampla para longa, depois dividir novamente"="
e remodelar de novo para longa:Uma versão melhorada / mais legível:
fonte
Por enquanto, consegui o que quero com o seguinte código:
Duas opções para melhorar as linhas acima, graças a @ A5C1D2H2I1M1N2O1R2T1 (que as forneceu nos comentários):
. com um duplo
cSplit
antes dedcast
:. com
cSplit
/trstrplit
e emdcast
vez dereshape
:fonte
cSplit
, como este: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
opção dupla :-)Aqui está como eu faria isso:
Criado em 2019-11-29 pelo pacote reprex (v0.3.0)
fonte
eval(parse(text=...))
... mas graças no entanto pela sua respostaparse
tem um péssimo representante, porque geralmente é usado por motivos errados; aqui está precisamente o seu caso de uso apropriado, passando de string para código. Você formatou o texto, mas não formatou para R, e nomeou listas; portanto, minha primeira linha o codifica para uma lista R, alterando "a; b" para "lista (a, b)". Depois, avaliamos e fazemos uma tabela.Você pode usar chamadas separadas
sub
para cada campo extraído desejado, por exemplo, paratype
:fonte