J'ai besoin de diviser une colonne qui contient des informations en plusieurs colonnes.
J'utiliserais tstrsplit
mais le même type d'informations n'est pas dans le même ordre parmi les lignes et j'ai besoin d'extraire le nom de la nouvelle colonne dans la variable. Important à savoir: il peut y avoir de nombreuses informations (des champs pour devenir de nouvelles variables) et je ne les connais pas tous, donc je ne veux pas d'une solution "champ par champ".
Voici un exemple de ce que j'ai:
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
Et j'aimerais avoir:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Une façon la plus simple de l'obtenir serait très appréciée! ( Remarque: je ne suis pas prêt à suivre un chemin dplyr / tidyr )
la source
structure()
j'ai mis à jour la réponse pour éviter ce problème (2) Ce sont des caractères exprès ... J'ai senti que les analyser correctement serait difficile et une question séparée. Il semble que vous ayez résolu le problème dans votre réponse et je vais jeter un coup d'œil et voir si je peux apprendre quelque chose de nouveau.Je suppose que vos données proviennent d'un fichier VCF , si c'est le cas, il existe un outil dédié à ces problèmes - bcftools .
Créons un exemple de fichier VCF pour tester:
Maintenant, nous pouvons utiliser bcftools . Ici, à titre d'exemple, nous sous-paramétrons AF et DP dans la colonne INFO :
Consultez le manuel pour plus d' options de requête .
la source
Nous pourrions nous séparer
";"
puis remodeler de large à long, puis à nouveau diviser"="
, puis remodeler à long à large:Une version améliorée / plus lisible:
la source
Pour l'instant, j'ai réussi à obtenir ce que je veux avec le code suivant:
Deux options pour améliorer les lignes ci-dessus, grâce à @ A5C1D2H2I1M1N2O1R2T1 (qui les a données dans les commentaires):
. avec un double
cSplit
avantdcast
:. avec
cSplit
/trstrplit
etdcast
au lieu dereshape
:la source
cSplit
, comme celui - ci:cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
suivitstrsplit
, suivi pardcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
option :-)Voici comment je le ferais:
Créé le 2019-11-29 par le package reprex (v0.3.0)
la source
eval(parse(text=...))
... mais merci quand même pour votre réponseparse
un mauvais représentant car il est souvent utilisé pour une mauvaise raison, voici précisément son cas d'utilisation approprié, allant de la chaîne au code. Vous avez mis en forme du texte, mais pas pour R, et vous avez nommé des listes, donc ma première ligne en fait un code pour une liste R, en changeant "a; b" en "liste (a, b)". Ensuite, nous l'évaluons et en faisons un tableau.Vous pouvez utiliser des appels séparés à
sub
pour chaque champ extrait souhaité, par exemple pourtype
:la source