2017-04-06 1 views
0

Ich habe zwei TSV-Dateien, jeweils mit Kopfzeilen und Spalten. Datei A hat Header: SampleID & RawReads, FileB hat Header: SampleID & ReadsPost. Ich möchte ReadSPost an FileA anhängen, damit die Daten mit der richtigen SampleID ausgerichtet werden.Anfügen der Spalte von einer TSV-Datei an eine andere (Unix)

Mein ursprünglicher Plan war dies in Python mit Wörterbüchern mit den Schlüsseln wie sampleIDs zu tun. Es muss jedoch einen einfacheren Weg geben, dies in bash zu tun!

Jede Hilfe wäre großartig!

+0

Danke! Beide Antworten funktionierten perfekt. Ich habe die Option Pandas benutzt, um ein gruppiertes Balkendiagramm mit den Parametern RawReads und ReadsPost mit Matplotlib zu erstellen. –

Antwort

0

Verwenden join und führen Sie eine vollständige äußere Verknüpfung (oder jede andere Art von Join):

>cat test.txt test2.txt 
SampleID RawReads 
1   18 
2   15 
5   21 
7   7 
SampleID  ReadsPost 
1   yes 
3   no 
4   yes 
5   yes 

> join -a1 -a2 test.txt test2.txt 
SampleID RawReads ReadsPost 
1 18 yes 
2 15 
3 no 
4 yes 
5 21 yes 
7 7 

Hinweis: Die Argument -a druckt Zeilen aus der Datei, die nicht miteinander verbunden sind. Um einen vollständigen äußeren Join zu erstellen, drucken Sie wie gezeigt Zeilen aus beiden Dateien.

0

Verwenden Sie pandas.read_csv, um Ihre Daten zu laden, müssen Sie möglicherweise sep='\t' für die Tab-Trennblätter festlegen. Sobald Sie Ihre zwei Datenrahmen geladen haben, können Sie oder pandas.merge verwenden. Für eine gute Referenz siehe Merge, join, and concatenate in der Pandas-Dokumentation.

Lassen Sie uns sagen, dass Ihre zwei tsv‘wie folgt aussehen:

file1:

SampleID  RawReads 
1   18 
2   15  
5   21  
7   7  

file2:

SampleID  ReadsPost 
1   yes 
3   no 
4   yes 
5   yes 

Merge Mit

Merge kann verwendet werden, zu implementieren, Datenbankstil verbindet sich auf zwei DataFrames. In unserem Fall können wir sehen, dass die beiden DataFrames in der Spalte SampleID nicht übereinstimmen. Wenn wir sicherstellen wollen, dass wir alle Daten aus beiden Frames erhalten, würden wir einen outer Join verwenden. Wenn wir nur Daten von dem einen oder anderen benötigen, könnten wir einen right oder left Join verwenden, abhängig davon, was wir behalten wollten. Hier ist ein Beispiel, um alles zu behalten.

df1 = pd.read_csv(file1, sep='\t') 
df2 = pd.read_csv(file2, sep='\t') 
merge_df = pd.merge(df1, df2, how='outer', on='SampleID') 
print(merge_df) 
    SampleID RawReads ReadsPost 
0   1  18.0  yes 
1   2  15.0  NaN 
2   5  21.0  yes 
3   7  7.0  NaN 
4   3  NaN  no 
5   4  NaN  yes 

Mit Concat

Concat kann entweder der Zeilen- oder Spaltenachse entlang erstrecken Datenrahmen verwendet werden. Lassen Sie uns sagen, SampleID war Ihr Index und Sie wollten nur die Werte in Datei2 zu Datei1 entlang der Spaltenachse verketten. Zum Beispiel:

df1 = pd.read_csv(file1, sep='\t', index_col='SampleID') 
df2 = pd.read_csv(file2, sep='\t', index_col='SampleID') 
concat_df = pd.concat([df1, df2], axis=1) 
print(concat_df) 
      RawReads ReadsPost 
SampleID 
1    18.0  yes 
2    15.0  NaN 
3    NaN  no 
4    NaN  yes 
5    21.0  yes 
7    7.0  NaN 

Wie gesagt, lesen Sie die Pandas-Dokumentation. Es ist eine unglaublich mächtige Bibliothek und eine großartige Einführung in die Arbeit mit Daten in Python.

Verwandte Themen