Soru:
Ada göre yatak kayıtlarının birleştirilmesi
bli
2017-08-10 17:46:40 UTC
view on stackexchange narkive permalink

Aşağıdaki yatak satırlarıyla başlayan bir dosya oluşturdum:

  $ head -6 /tmp/bed_with_gene_ids.bedI 3746 3909 "WBGene00023193". -I 3746 3909 "WBGene00023193". -I 4118 4220 "WBGene00022277". -I 4118 4358 "WBGene00022277". -I 4118 10230 "WBGene00022277". -I 4220 4223 "WBGene00022277". -  

Başlangıç ​​için minimum ve bitiş için maksimum sayı alarak ad alanına (4. sütun) göre onları birleştirmek istiyorum. Aynı ada sahip tüm kayıtlar için diğer alanların aynı olması beklenir.

Beklenen sonuç:

  I 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -  

bedtools groupby 'e dayalı potansiyel bir çözüm buldum: https://www.biostars.org/p/145751/#145775


Örnek veriler:

  cat genes.bedchr14 49894259 49895806 ENSMUST00000053290 0.000000 ... chr14 49894873 49894876 ENSMUST00000053290 0.000000. ..chr14 49894876 49895800 ENSMUST00000053291 0.000000 ... chr14 49895797 49895800 ENSMUST00000053291 0.000000 ... chr14 49901908 49901941 ENSMUST00000053291 0.000000 ...  

Örnek çıktı:

>
  sırala -k4,4 genes.bed \ | groupBy -g 1,4 -c 4,2,3 -o sayım, min, maks \ | awk -v OFS = '\ t' '{print $ 1, $ 4, $ 5, $ 2, $ 3}' chr14 49894259 49895806 ENSMUST00000053290 2chr14 49894876 49901941 ENSMUST00000053291 3  

Ancak:

  1. groupBy davranışını anlamıyorum (Neden -g 1,4 ve sadece -g 4 değil?, Neden -c 4,2,3 bu sırayla ve sonra awk?)

  2. Bu kod değil benim için çalışın.

Yukarıda verilen çözümü denediğimde ne olacağı:

  $ head -3 /tmp/bed_with_gene_ids.bed | bedtools groupby -g 1,4 -c 4,2,3 -o sayım, min, maks | awk -v OFS = '\ t' '{baskı $ 1, $ 4, $ 5, $ 2, $ 3}' 3 3746 4220  

İşte işe yarayacağını düşündüğüm şeye dayalı girişimler dokümantasyon:

  $ head -6 /tmp/bed_with_gene_ids.bed | bedtools grubu -g4-c 1,2,3,4,5,6 -o ilk, min, maks, farklı, ilk, ilk, 3746 10230 "WBGene00022277", "WBGene00023193". - $ kafa -6 /tmp/bed_with_gene_ids.bed | yatak takımları grubu -g4-c 1,2,3,4,5,6 -o ilk, min, maks, son, ilk, ilkI 3746 10230 "WBGene00022277". - $ kafa -6 /tmp/bed_with_gene_ids.bed | yatak takımları grubu -g 4-c 1,2,3,5,6 -o önce, min, max, ilk, ilk I 3746 10230. -  

Neden iki farklı değere sahip olduğum 4. sütuna göre gruplandırdığımda, sonuçta iki satır elde edemiyorum anlamıyorum.

Dokümantasyon sayfasındaki yorumlara dayanarak dokümantasyonun güncel olmadığını anlıyorum. Özellikle, tüm alanların çıktısının alınmasını isterse gerekli olan bir -full seçeneği vardır. Yukarıda bahsedilen çözümü yeniden okuduktan sonra, artık -g seçeneği ve awk yeniden düzenlemesi için birden çok sütunun nedenini anladığımı düşünüyorum. Bu nedenle aşağıdaki girişim.

  $ head -6 /tmp/bed_with_gene_ids.bed | yatak takımları grubu: -g 1,4,5,6-c 2,3 -o min, maks. tam 3746 3909 "WBGene00023193". - 3746 10230  

Ancak bu hala bana iki satır vermiyor.

İstediğimi verimli bir şekilde yapabilecek başka araçlar var mı?


Düzenleme: Çözüm

Bu yanıta göre, temel araçlarla ilgili sorun, en son sürümde (Ağustos 2017 itibarıyla 2.26.0) bir hata olmasıdır. İşlevsel bir bedtools grubuna sahip olmak için, geliştirme sürümünü github'dan almanız gerekir.

Bedtools'un github sürümüyle, artık beklenen sonucu şu şekilde alabilirim:

  $ head -6 /tmp/bed_with_gene_ids.bed | yatak takımları grubu -g 1,4,5,6 -c 2,3 -o min, max | awk -v OFS = "\ t" '{baskı $ 1, $ 5, $ 6, $ 2, $ 3, $ 4}' I 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -  

Yazdırılmalarını sağlamak için -g içine (4. alanın yanı sıra) 1, 5 ve 6 numaralı alanları dahil ediyorum. Yatak dosyamda, belirli bir alan 4 değeri için aynı olmaları gerekir. awk kısmı, görünüşe göre çıktı sırası üzerinde tam kontrole sahip olmadığı için gereklidir: -g alanları -c alanlarından önce gelir.

Çizgiler arasında farklılarsa, skor ve iplik alanlarıyla ne yapmak istersiniz yoksa bu asla olmaz mı?
Aslında puan alanı umrumda değil ve ideal olarak bunu "" olarak ayarlardım. zaten durum böyle değilse. İplik alanının her zaman aynı olacağını garanti edemem, ancak bu yatak satırları ad alanına gene_id koyduğum transkript notlarından geldiği için, genel olarak aynı ad için iplikçinin olacağı doğru olacaktır. aynısı. Yine de bunu kontrol etmeliyim.
Beş yanıtlar:
OrdiNeu
2017-08-10 22:40:41 UTC
view on stackexchange narkive permalink

Bahsetmeseniz de, yatak takımları v2.26.0 kullandığınızı tahmin ediyorum. GroupBy'nin 2.26.0 sürümünde karşılaştığınız bir hata var (yayınlandıktan kısa bir süre sonra düzeltildi, bu nedenle ya hata ortaya çıkmadan önce bir sürümü kullanmanız ya da mevcut kaynak kodunu https://github.com/arq5x/bedtools2)

v2.26.0:

  local10: ~ / Documents / tmp $ cat asdf. yatak I 3746 3909 WBGene00023193. -I 3746 3909 WBGene00023193. -I 4118 4220 WBGene00022277. -I 4118 4358 WBGene00022277. -I 4118 10230 WBGene00022277. -I 4220 4223 WBGene00022277. -local10: ~ / Documents / tmp $ groupBy -i asdf.bed -g 4 -c 2,3 -o min, max 3746 10230 

v2.26.0-125-g52db654 (IE kaynak kodunu github'dan derleyerek):

  local10: ~ / Documents / tmp $ bedtools2 / bin / groupBy -i asdf.bed -g 4 -c 2,3 -o min, maxWBGene00023193 3746 3909WBGene00022277 4118 10230  

Sorularınızı yanıtlamak için:

1) Yukarıdaki çıktımın önce gruplanmış sütunları verdiğini fark edebilirsiniz; Çıktıyı sırayla geri almak için awk aracılığıyla yeniden sıralamanız gerekir. Neden hem 1. hem de 4. sütunda gruplamayı seçtiklerine gelince: Birden fazla kromozom üzerinde aynı ada sahipseniz, bunları ayrı özellikler olarak ele almak isteyebilirsiniz.

2) Sürüm farklılıkları, cevabımın ilk kısmı.


Dosyayı gerçekten birleştirmek için:

Bunu v2.26.0'dan farklı bir sürümle çalıştırdığınızdan emin olun (Devon Ryan yorumlarda yazdığı gibi, eklemek isteyebilirsiniz 6. sütunu -g 'ye özgü yapmak için):

  ./bedtools2/bin/groupBy -i asdf.bed -g 1,4 -c 2 , 3,5,6 -o min, max, first, first \ | awk -v OFS = '\ t' '{baskı $ 1, $ 3, $ 4, $ 2, $ 5, $ 6}' I 3746 3909 WBGene00023193. -I 4118 10230 WBGene00022277. -  
"-G 1,4" e 6 eklerseniz, o zaman farklı ipliklerde genleri birleştirmemekten yararlanırsınız. UCSC bazen bunlara sahiptir ve bunlar gerçekten aynı gen değildir ve birleştirilmemeleri gerekir. "-C" de 1'e veya "-g" ye eklerseniz 6'ya ihtiyacınız yoktur.
Ian Sudbery
2017-08-10 18:45:38 UTC
view on stackexchange narkive permalink

Bunu CGAT araç seti ile yapabilirsiniz:

cgat bed2bed --method = merge - birleştirme-isme -I bed_with_gene_ids.bed

Bu kadar büyük bir paket kurmak, bu görev için gereğinden fazla olabilir.

Cgat'ın bilgisayarımda zaten kurulu olduğu görülüyor (ne amaçla unutmuş olsam da). Önerdiğiniz komutu denedim ve sonunda "I 3746 3909" WBGene00023193 "ün kopyasını buldum. -`. Doğrusu, orijinal yatakta çift hatlar vardı. Ama bu davranış bekleniyor mu?
Ayrıca, bunu sadece ilk 6 satırda değil tüm dosya üzerinde çalıştırırsam, bir süre sonra program "TypeError:" <"'Bed' ve 'Bed' 'örnekleri arasında desteklenmiyor. Hatanın devam edip etmediğini görmek için cgat'ı yükseltiyorum.
Sorunları buradan bildirdim: https://github.com/CGATOxford/cgat/issues/347
İlk sorununuz, amaçlanan davranışın farkında olduğum kadarıyla değil. Ve ikincisinin amaçlanmadığından oldukça eminim. Bir hata raporu göndermenizi öneririm.
Direkleri geçtik!
Cotton Seed
2017-08-14 03:27:07 UTC
view on stackexchange narkive permalink

Bunu Hail ile kolayca yapabilirsiniz. Hail, genetik veri kümelerine açıklama eklemek için temel olarak BED dosyalarını kullanır (son annotate_varutors_table örneğine bakın), ancak sınırlandırılmış metin dosyalarını işlemek için Hail'in genel olanaklarını kullanarak BED dosyalarını değiştirebilirsiniz. Örneğin:

  $ cat genes.bedI 3746 3909 "WBGene00023193". -I 3746 3909 "WBGene00023193". -I 4118 4220 "WBGene00022277". -I 4118 4358 "WBGene00022277". -I 4118 10230 "WBGene00022277". -I 4220 4223 "WBGene00022277". -  

Dolu betiği (python kodu):

  dolu içe aktarımdan * hc = HailContext () (hc .import_table ('genes.bed', impute = True, no_header = True) .aggregate_by_key ('f0 = f0, f3 = f3', 'f1 = f1.min (), f2 = f2.max (), f4 = ".", f5 = "-"' ) .select (['f0', 'f1', 'f2', 'f3', 'f4', 'f5']) .export ('genes_merged.bed', header = False))  

Sonuç:

  $ cat genes_merged.bed I 3746 3909 WBGene00023193. -I 4118 10230 WBGene00022277. -  

Chrom ve name üzerinde topluyorum, böylece bu çözüm farklı kromozomlardaki girişleri birleştirmez. Alanları yeniden düzenlemek için seçme gereklidir çünkü aggregate_by_key toplanan anahtarları ilk sıraya yerleştirir.

Açıklama: Dolu üzerinde çalışıyorum.

Alex Reynolds
2017-08-10 23:48:21 UTC
view on stackexchange narkive permalink
  $ cut -f4-6 in.bed | sed 's / \ t / _ / g' | sırala | uniq | awk -F'_ '' {system ("grep" $ 1 "in.bed | bedops --merge -"); 0 $ yazdır; } '| yapıştır -d "\ t" - - | sed 's / _ / \ t / g' | sort-bed - > answer.bed  

Örnek girdinize göre:

  $ more in.bedI 3746 3909 "WBGene00023193". -I 3746 3909 "WBGene00023193". -I 4118 4220 "WBGene00022277". -I 4118 4358 "WBGene00022277". -I 4118 10230 "WBGene00022277". -I 4220 4223 "WBGene00022277". -  

answer.bed dosyası:

  $ more answer.bedI 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -  

sort-bed ile sıralama, sonunda kullanışlıdır, böylece onu yönlendirebilir veya başka BEDOPS araçlarıyla veya diğer araçlarla çalışabilirsiniz. sıralı YATAK girdisini kabul edin.

Akış, genellikle işleri yapmanın oldukça verimli bir yoludur.


Bu nasıl çalışır

İşte ardışık düzen yine:

  $ cut -f4-6 in.bed | sed 's / \ t / _ / g' | sırala | uniq | awk -F'_ '' {system ("grep" $ 1 "in.bed | bedops --merge -"); 0 $ yazdır; } '| yapıştır -d "\ t" - - | sed 's / _ / \ t / g' | sort-bed - > answer.bed  

4'ten 6'ya kadar olan sütunları (id, skor ve şerit) keserek, sekmeleri alt çizgilerle değiştirerek, kopyaları sıralayarak ve kaldırarak başlıyoruz:

  cut -f4-6 in.bed | sed 's / \ t / _ / g' | sıralama | uniq  

Buradan çıkardığımız şey, "iğnelerin" sıralı bir listesidir - her bir ID-skor-iplik kombinasyonu için bir tane: bir ID-iğne - orijinal BED dosyasını grep veya filtrelemek için kullanabiliriz.

Bu liste awk 'ye taşınır ve her kimlik iğnesi için orijinal BED dosyasına karşı> grep ve alt kümeyi, çakışan aralıkları birleştiren bedops --merge - 'e yönlendirir.

Birleştirmenin yalnızca çakışan aralıklarda işe yaradığını unutmayın. Birleştirme, min-maks çifti döndürmekle aynı şey olmayabilir ve bu ardışık düzen, çakışmayan aralıklar varsa kesilir. Ancak awk ifadesini şu şekilde değiştirebilirsiniz: girdi aralıklarını işleyin ve minimum ve maksimum aralık koordinatlarını döndürün, eğer gerçekten istediğiniz buysa, awk 'ye gelen tüm aralıklardaki minimum ve maksimum değerleri izleyerek ve END bloğu.

system komutu, birleştirilen aralığı bir satıra yazdırır. Aşağıdaki print $ 0 ifadesi, iğneyi sonraki satıra yazdırır:

  awk -F'_ '' {system ("grep" $ 1 "in.bed | bedops --birleştirmek - "); 0 $ yazdır; } ' 

Her bir alternatif çizgi çiftini alıp paste ile yeniden doğrusallaştırıyoruz. Bu sonuç artık dört sütun içeriyor: her birleştirilmiş aralığın üç sütunu ve kimlik iğnesi.

Ardından, alt çizgileri sekmelerle değiştirmek için sed kullanırız, böylece kimlik iğnesini sekmeyle ayrılmış üç kimlik skoru dizisi sütununa dönüştürürüz:

  yapıştır -d "\ t" - - | sed 's / _ / \ t / g'  

Çıktı artık altı sütunlu bir BED dosyasıdır, ancak, daha üstteki kimlik iğnelerine uyguladığımız sıralama düzenine göre sıralanmıştır. istemediğimiz boru hattı. Gerçekten istediğimiz, BEDOPS sort-bed 'e göre sıralanmış BED'dir, böylece daha fazla set işlemi yapabilir ve doğru sonucu alabiliriz. Bu nedenle, answer.bed:

  sort-bed - > cevabına sıralanmış bir dosya yazmak için bunu  sort-bed -  'e yönlendiriyoruz. yatak  
Cevabınız için teşekkürler, işe yarıyor ve nasıl olduğunu anladığımı düşünüyorum. Belki farklı adımlar hakkında bazı açıklamalar faydalı olabilir.
terdon
2017-08-10 18:59:49 UTC
view on stackexchange narkive permalink

Bir adı paylaşan tüm hatlar için başlangıç ​​ve bitiş konumları dışındaki her şeyin aynı olacağından% 100 eminseniz, bunu kendiniz yapabilirsiniz. Örneğin, Perl'de:

  $ perl -lane '$ start {$ F [3]} || = $ F [1]; eğer ($ F [1] < $ start {$ F [3]}) {$ start {$ F [3]} = $ F [1]} eğer ($ F [2] > $ end {$ F [3 ]}) {$ end {$ F [3]} = $ F [2]} $ chr {$ F [3]} = $ F [0]; $ rest {$ F [3]} = "\ t" ye katıl, @F [4, $ # F]; END {foreach $ n (keys% chr) {print "$ chr {$ n} \ t $ start {$ n} \ t $ end {$ n} \ t $ n \ t $ rest {$ n}"}} 'file.bed I 3746 3909 "WBGene00023193". -I 4118 10230 "WBGene00022277". -  
Etkili bir aracın zaten var olduğunu ve tekerleği yavaş bir betik dilinde yeniden icat etmemi engelleyeceğini umuyordum.
@bli kesinlikle, bu çok daha mantıklı. Bunun yeterince basit olduğunu düşündüm, bu yüzden bir komut dosyası çözümü de verebilirim. Ama evet, bu yavaş olacak ve aynı zamanda çok saf olacak, bu yüzden dosyalarınız biraz farklıysa bozulacaktır.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...