Ich muss eine Spalte, die Informationen enthält, in mehrere Spalten aufteilen.
Ich würde verwenden, tstrsplit
aber die gleiche Art von Informationen ist nicht in der gleichen Reihenfolge zwischen den Zeilen und ich muss den Namen der neuen Spalte innerhalb der Variablen extrahieren. Wichtig zu wissen: Es kann viele Informationen geben (Felder, die zu neuen Variablen werden), und ich kenne nicht alle, daher möchte ich keine "Feld für Feld" -Lösung.
Unten ist ein Beispiel für das, was ich habe:
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
Und ich würde gerne bekommen:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Ein sehr einfacher Weg, dies zu erreichen, wäre sehr dankbar! ( Hinweis: Ich bin nicht bereit, einen dplyr / tidyr-Weg einzuschlagen. )
quelle
structure()
Ich habe die Antwort aktualisiert, um dieses Problem zu vermeiden. (2) Es handelt sich absichtlich um Zeichen. Ich hatte das Gefühl, dass es schwierig wäre, sie richtig zu analysieren und eine separate Frage. Es scheint, dass Sie es in Ihrer Antwort gelöst haben und ich werde einen Blick darauf werfen und sehen, ob ich etwas Neues lernen kann.Ich vermute, Ihre Daten stammen aus einer VCF-Datei . Wenn ja, gibt es ein spezielles Tool für solche Probleme - bcftools .
Erstellen wir eine Beispiel- VCF- Datei zum Testen:
Jetzt können wir bcftools verwenden . Hier als Beispiel unterteilen wir AF und DP aus der INFO- Spalte:
Weitere Abfrageoptionen finden Sie im Handbuch .
quelle
Wir könnten uns aufteilen und
";"
dann weit zu lang umformen, dann wieder aufteilen"="
und dann wieder zu lang zu weit umformen:Eine verbesserte / besser lesbare Version:
quelle
Im Moment habe ich es geschafft, mit dem folgenden Code das zu bekommen, was ich will:
Zwei Optionen zur Verbesserung der obigen Zeilen dank @ A5C1D2H2I1M1N2O1R2T1 (der sie in Kommentaren angegeben hat):
. mit einem Doppel
cSplit
vordcast
:. mit
cSplit
/trstrplit
unddcast
stattreshape
:quelle
cSplit
, so :cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
gefolgt vontstrsplit
: gefolgt vondcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
:-)So würde ich es machen:
Erstellt am 29.11.2019 durch das reprex-Paket (v0.3.0)
quelle
eval(parse(text=...))
... aber trotzdem danke für Ihre Antwortparse
einen schlechten Ruf, weil er oft aus falschen Gründen verwendet wird. Hier ist genau der geeignete Anwendungsfall, der von der Zeichenfolge zum Code reicht. Sie haben Text formatiert, aber nicht für R formatiert, und Sie haben Listen benannt. In meiner ersten Zeile wird er für eine R-Liste codiert, indem "a; b" in "Liste (a, b)" geändert wird. Dann bewerten wir es und machen daraus eine Tabelle.Sie können separate Aufrufe
sub
für jedes gewünschte extrahierte Feld verwenden, z. Btype
.:quelle