Kysymys:
Alueiden yhdistäminen tunnuksen mukaan
bapors
2018-03-20 14:03:00 UTC
view on stackexchange narkive permalink

Minulla on valtava tiedosto (20 GB ), jolla on useita genomisia sijainteja, ja jokaiselle sijainnille on oma tunniste ( 4. sarake ), joka on joskus sama.

  file1.txtchr1 10 20 ABCchr1 13 20 ABCchr1 14 21 ABCchr1 22 27 ABCchr1 29 37 ABCchr2 15 21 JJJchr2 21 31 JJJchr2 23 27 JJJchr2 35 56 JJJchr2 25 26 MMMchr3 32 42 MMM 76 MMMchr3 88 101 MMMchr3 101 105 MMM  

Yritän yhdistää sarakkeiden 2 ja 3 alueet, jos ne ovat sama kromosomi ja sama tunniste (sarakkeet 1st ja 4th ovat samat).

Olen yrittänyt käyttää bedtools , kuten tämä viesti näyttää, joka näyttää hyvin samankaltaiselta, mutta ei samalta kuin minun, koska he etsivät erilaisia ​​ulostuloja (alue vs. yhdistäminen)

Joten vastaukset kyseisessä viestissä käytettiin groupby -tunnusta bedtools2: ssä, lähdekoodi github -palvelusta.

Olen soveltanut samaa kuin seuraava:

  ./groupBy -i ../file1.txt -g 1,4 -c 2,3 -o min , enintään | awk -v OFS = '\ t' '{tulosta $ 1, $ 3, $ 4, $ 2}' chr1 10 37 ABCchr2 15 56 JJJchr2 25 26 MMMchr3 32105 MMM  

Mutta se vain yhdistää tunnisteiden alueet .. Se ryhmitellään eikä sulautu.

Ja jos käytän bedtools v2.26 merge -toimintoa:

  >sort -k1,1 -k2,2n file1.txt > file2 .txt>cat file2.txtchr1 10 20 ABCchr1 13 20 ABCchr1 14 21 ABCchr1 22 27 ABCchr1 29 37 ABCchr2 15 21 JJJchr2 21 31 JJJchr2 23 27 JJJchr2 25 26 MMMchr2 35 56 JJJchr3 32 42 file2.txt chr1 10 21chr1 22 27chr1 29 37
chr2 15 31chr2 35 56chr3 32 42chr3 45 76chr3 88 105  

Mikä sulautuu näkemättä tunnisteita, koska se antaa minulle myös tämän tuotoksen.

Haluan yhdistä alueet, jos ne ovat päällekkäisiä , jos niillä on sama 1. ja 4. sarake kuin:

  odotettavissa_output.txtchr1 10 21 ABCchr1 22 27 ABCchr1 29 37 ABCchr2 15 31 JJJchr2 35 56 JJJchr2 25 26 MMMchr3 32 42 MMMchr3 45 76 MMMchr3 88 105 MMM  

Minulla on vain 15 Gt RAM-muistia, joten voin älä tallenna koko tiedostoa muistiin.

Mahdollinen kopio [Yhdistävät sängyn tietueet nimen perusteella] (https://bioinformatics.stackexchange.com/questions/2265/merging-bed-records-based-on-name)
Tämä viesti on jo linkitetty merkintääni, ja he etsivät erilaisia ​​tuloksia, joten ei kopiota
Neljä vastused:
dariober
2018-03-20 15:38:19 UTC
view on stackexchange narkive permalink

Jos ymmärrän oikein, voit luoda nuken kromosomeja, jotka on valmistettu yhdistämällä kromosomi ja tunniste, yhdistää bedtooliin, jakaa takaisin kromosomit ja tunnisteet. Esim.

  awk -v OFS = '\ t' '{tulosta $ 1 "_" $ 4, $ 2, $ 3}' tiedosto1.txt \ | mergeBed \ | sed 's / _ / \ t /' \ | awk -v OFS = '\ t' '{tulosta $ 1, $ 3, $ 4, $ 2}'  

(Olettaen, että "_" ei ole osa kromosomin tai tunnisteen nimeä, säädä vastaavasti, jos on ).

Kiitos vastauksesta, se toimii hyvin. Voisiko "bedtools" valittaa, jos sarakkeessa "$ 4" on erikoismerkkejä?
@bapors miksi 4. sarakkeessa olisi erikoismerkkejä?
@bapors, jos tarkoitat, että sänkytyökalut valittavat, jos muokatussa 1. kentässä olisi erikoismerkkejä, muokkaa sitten kysymystäsi antamaan edustava esimerkki syötetiedoistasi. Se sanoi, että yritin vain käyttää merkkejä `& ^% * () @ # ^`, eikä sängyn työkaluilla ollut mitään ongelmaa.
Ei, syötteelläni ei ole erikoismerkkejä, kysymykseni oli yksinomaan teoreettinen. Täydellinen!
user1141
2018-03-20 19:06:24 UTC
view on stackexchange narkive permalink

Vain lisäämällä tämä voidaan tehdä bedtools -sovelluksella käsittelemällä kukin tunniste erikseen, mikä saattaa olla käytännöllistä suuren tiedostosi vuoksi.

  ID: lle muodossa $ (perl -ane 'print $ F [3]. "\ n";' file1.txt | lajittele | uniq); tee grep $ ID file1.txt | \ perl -ane 'chomp; tulosta liitos ("\ t", @ F [0 .. $ # F]). "\ n"; ' | \ lajittele -V | \ bedtools yhdistyvät -i stdin -c 4 -o erillinen | lajittele -V  
Devon Ryan
2018-03-20 14:42:12 UTC
view on stackexchange narkive permalink

Seuraava python-komentosarja tekee mitä haluat, ja sen pitäisi olla suhteellisen muistin tehokas. Se käsittelee yhtä kromosomia kerrallaan, joten joko lajittele syöte tai varmista, että ainakin ryhmän merkinnät ovat vierekkäin.

  # ! / usr / bin / env pythonimport sys # Käsittele lajiteltu luettelo joukkoista (esim. [(0, 10), (10, 20), ...]) # Päällekkäiset kohteet yhdistetään ja luettelo yhdistetyistä alueista on # palautettu (esim. [(0, 20), ...]) def sulautuminen (arvot): alku, loppu = arvot [0] o = [] arvolle v arvoissa [1:]: jos v [0] < = loppu: jos v [1] > loppu: loppu = v [1] muu: o.append ((start, end)) start, end = v o.append ((start, end)) return o # Process a yksi kromosomi, yksi ryhmä ajallisen prosessin aikanaChrom (d, kromi): k: lle, v d: ssä. (): v.sort () tuples = yhdistä (v) t: lle tuleissa: print ("{} \ t { } \ t {} \ t {} ". muoto (kromi, t [0], t [1], k)) def main (): currentChrom = Ei mitään d = dict () riville sys.stdin: cols = linja. s plit () if cols [0] == currentChrom: jos cols [3] ei sisällä d: d [cols [3]] = [] d [cols [3]]. liitä ((int (cols [1]), int (cols [2]))) else: if currentChrom: processChrom (d, currentChrom) d = dict () d [cols [3]] = [] d [cols [3]]. liitä ((int (cols [ 1]), int (cols [2]))) currentChrom = cols [0] if currentChrom: processChrom (d, currentChrom) jos __nimi__ == "__main__": main ()  

Käyttö on python foo.py < foo.txt ja lähtö on:

  chr1 10 21 ABCchr1 22 27 ABCchr1 29 37 ABCchr2 25 26 MMMchr2 15 31 JJJchr2 35 56 JJJchr3 32 42 MMMchr3 45 76 MMMchr3 88105 MMM  

Huomaat, että tätä ei välttämättä lajitella, joten sinun kannattaa välittää tulos bedtools sort - tai sort -kohdassa.

Kiitos vastauksesta. Tarkoitatko, että syötetiedosto tulisi lajitella ensimmäisen tai neljännen sarakkeen mukaan?
Voit myös lajitella sen ensimmäisen sarakkeen mukaan. Voit vaihtoehtoisesti kirjoittaa ohjelman käsittelemään neljännen sarakkeen mukaan lajiteltuja tiedostoja, mutta nykyistä komentosarjaa ei ole kirjoitettu käsittelemään sitä.
Varma. Koodi on puhdas ja toimii hyvin. Olen iloinen siitä, että se on mukautettavissa
Chris_Rands
2018-03-20 20:04:13 UTC
view on stackexchange narkive permalink

Tässä on melko yksinkertainen (ja toivottavasti luettavissa oleva) natiivi Python-ratkaisu. Siinä oletetaan, että sängytiedosto on lajiteltu ennen jäsentämistä:

  itertooleista tuo ryhmäsykliluokka BedRecord (objekti): def __init __ (itse, chr, alku, loppu, ominaisuus): self.chr = chr self.start = start self.end = end self.feature = featuredef parse_records (in_file): avoimen (in_file) muodossa f: riville f: tuota BedRecord (* line.strip (). split ()) def merge_groups ( ryhmä): lähtö = [seuraava (ryhmä)] ryhmän tietueelle: jos ennätys. aloita < = lähtö [-1]. loppu: lähtö [-1]. loppu = max (lähtö [-1]. loppu, ennätys. end) else: output.append (record) return outputdef main (in_file): for _, ryhmä ryhmässäby (parse_records (in_file), lambda x: (x.chr, x.feature)): r: lle merge_groups (group) : print ('\ t'.join ([r.chr, r.start, r.end, r.feature])), jos __nimi__ ==' __main__ ': main (' test.bed ')  
Kiitos vastauksesta. Siinä oletetaan, että tulo lajitellaan minkä sarakkeen mukaan?
@bapors tehokkaasti kromosomien mukaan, sitten ominaisuus ja sitten alkuarvo, voit helposti lisätä koodin lajiteltavaksi näiden kriteerien perusteella, jos tätä oletusta rikotaan


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...