Saya perlu membagi kolom yang berisi informasi menjadi beberapa kolom.
Saya akan menggunakan tstrsplit
tetapi jenis informasi yang sama tidak dalam urutan yang sama di antara baris dan saya perlu mengekstrak nama kolom baru dalam variabel. Penting untuk diketahui: mungkin ada banyak informasi (bidang untuk menjadi variabel baru) dan saya tidak tahu semuanya, jadi saya tidak ingin solusi "bidang demi bidang".
Di bawah ini adalah contoh dari apa yang saya miliki:
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
Dan saya ingin mendapatkan:
# chr pos end pos type
#1: chr1 123 4 <NA> 3
#2: chr2 435 6 <NA> <NA>
#3: chr4 120 5 TRUE 2
Cara paling mudah untuk mendapatkan itu akan sangat dihargai! ( Catatan: Saya tidak mau menggunakan cara dplyr / tidyr )
r
data.table
reshape
Cath
sumber
sumber
structure()
saya telah memperbarui jawaban untuk menghindari masalah ini (2) Mereka adalah karakter yang sengaja ... Saya merasa menguraikannya dengan benar akan menjadi sulit) dan pertanyaan yang terpisah. Tampaknya Anda menyelesaikannya dalam jawaban Anda dan saya akan melihat dan melihat apakah saya dapat mempelajari sesuatu yang baru.Saya menduga data Anda berasal dari file VCF , jika demikian ada alat khusus untuk masalah seperti itu - bcftools .
Mari kita buat contoh file VCF untuk pengujian:
Sekarang kita bisa menggunakan bcftools . Di sini sebagai contoh, kami menetapkan AF dan DP dari kolom INFO :
Lihat manual untuk opsi permintaan lainnya.
sumber
Kita dapat memecah
";"
kemudian membentuk kembali lebar-ke-panjang, lalu membelah lagi"="
, kemudian membentuk kembali ke panjang-ke-lebar:Versi yang ditingkatkan / lebih siap pakai:
sumber
Untuk saat ini, saya berhasil mendapatkan apa yang saya inginkan dengan kode berikut:
Dua opsi untuk meningkatkan baris di atas, terima kasih kepada @ A5C1D2H2I1M1N2O1R2T1 (yang memberi mereka komentar):
. dengan ganda
cSplit
sebelumdcast
:. dengan
cSplit
/trstrplit
dandcast
bukannyareshape
:sumber
cSplit
, seperti ini:cSplit(cSplit(myDT, "info", ";", "long"), "info", "=")[, dcast(.SD, chr + pos ~ info_1, value.var = "info_2")]
.cSplit
diikuti olehtstrsplit
, diikuti olehdcast
:cSplit(myDT, "info", ";", "long")[, c("t1", "t2") := tstrsplit(info, "=", fixed = TRUE)][, dcast(.SD, chr + pos ~ t1, value.var = "t2")]
.cSplit
opsi ganda :-)Begini cara saya melakukannya:
Dibuat pada 2019-11-29 oleh paket reprex (v0.3.0)
sumber
eval(parse(text=...))
... tapi terima kasih atas jawaban Andaparse
memiliki perwakilan yang buruk karena sering digunakan untuk alasan yang salah, inilah kasus penggunaannya yang tepat, beralih dari string ke kode. Anda telah memformat teks, tetapi tidak diformat untuk R, dan Anda telah menamai daftar, jadi baris pertama saya membuatnya menjadi kode untuk daftar R, dengan mengubah "a; b" menjadi "daftar (a, b)". Kemudian kami mengevaluasinya dan membuat tabel dari itu.Anda dapat menggunakan panggilan terpisah untuk
sub
untuk setiap bidang yang diekstraksi yang diinginkan, misalnya untuktype
:sumber