Muszę podzielić kolumnę zawierającą informacje na kilka kolumn.
Chciałbym użyć, tstrsplit
ale ten sam rodzaj informacji nie jest w tej samej kolejności między wierszami i muszę wyodrębnić nazwę nowej kolumny w zmiennej. Ważne, aby wiedzieć: może istnieć wiele informacji (pola stają się nowymi zmiennymi) i nie znam ich wszystkich, więc nie chcę rozwiązania typu „pole po polu”.
Poniżej znajduje się przykład tego, co mam:
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
I chciałbym uzyskać:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Doceniony zostanie najprostszy sposób, aby to osiągnąć! ( Uwaga: nie chcę iść drogą dplyr / tidyr )
r
data.table
reshape
Cath
źródło
źródło
structure()
Zaktualizowałem odpowiedź, aby uniknąć tego problemu (2) Są to postacie celowo ... Czułem, że ich poprawna analiza byłaby trudna i osobne pytanie. Wydaje się, że rozwiązaliście to w swojej odpowiedzi, a ja przyjrzę się i zobaczę, czy mogę nauczyć się czegoś nowegoZgaduję, że twoje dane pochodzą z pliku VCF , jeśli tak, istnieje dedykowane narzędzie do takich problemów - bcftools .
Utwórzmy przykładowy plik VCF do testowania:
Teraz możemy używać bcftools . Tutaj jako przykład dzielimy AF i DP z kolumny INFO :
Więcej informacji na temat zapytań znajduje się w instrukcji .
źródło
Możemy podzielić na,
";"
a następnie przekształcić z szerokiego na długi, a następnie ponownie podzielić"="
, a następnie przekształcić z powrotem na długi i szeroki:Ulepszona / bardziej czytelna wersja:
źródło
Na razie udało mi się uzyskać to, czego chcę, za pomocą następującego kodu:
Dwie opcje ulepszenia powyższych linii, dzięki @ A5C1D2H2I1M1N2O1R2T1 (który dał je w komentarzach):
. z podwójnym
cSplit
przeddcast
:. z
cSplit
/trstrplit
idcast
zamiastreshape
:źródło
cSplit
, tak:cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
a następnietstrsplit
, po czym następujedcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
opcji podwójnej :-)Oto jak bym to zrobił:
Utworzono 29.11.2019 przez pakiet reprezentx (v0.3.0)
źródło
eval(parse(text=...))
... ale dziękuję za twoją odpowiedźparse
ma złą reputację, ponieważ jest często używany z niewłaściwego powodu, oto dokładnie jego odpowiedni przypadek użycia, przechodząc od łańcucha do kodu. Sformatowałeś tekst, ale nie sformatowałeś dla R, i nazwałeś listy, więc mój pierwszy wiersz sprawia, że koduje dla listy R, zmieniając „a; b” na „listę (a, b)”. Następnie oceniamy go i tworzymy z niego tabelę.Możesz użyć osobnych wywołań
sub
dla każdego żądanego wyodrębnionego pola, np. Dlatype
:źródło