2016-07-15 8 views
0

mein Datenrahmen (bact) hat ~ 4500 Zeilen (bakterielle Taxa) und 19 nützliche Spalten (meist Proben). Dies ist die Ausgabe von Metegenomics-Daten, die Rang-ID-Informationen (geordneter Faktor) und Genübereinstimmungen in mehreren Stichprobenspalten (p'x ') enthalten, sowie eine Spalte mit Summen von Genübereinstimmungen über Taxa (Summe) hinweg. Ich wollte nach der Bereinigung der Zeilen in das 'Long'-Format umwandeln.Filter große Datenmenge mit geordneten Faktoren, abhängig von anderen Werten in R mit dplyr?

Das Problem ist: Es gibt viele überlappende Taxa (geordnete Taxa, die nicht klassifiziert sind, und untergeordneten Taxa, die eine Klassifizierung (namen) hat), und das Ziel für die Downstream-Datenanalyse und grafische Darstellung ist phylogenetisch hat relevante Taxa Beschreibungen mit den Daten (in diesem Fall Gen entspricht).

Zum Beispiel:

rankID    taxon   total  
0.2.1    Acidobacteria 994577 
0.2.1.1   Acidobacteria 917570 
0.2.1.1.1   11B-2   3 
0.2.1.1.1.1  unclassified 3 
0.2.1.1.1.1.1  unclassified 3 
0.2.1.1.2   AT-s3-28  2975 
0.2.1.1.2.1  unclassified 2975 
0.2.1.1.2.1.1  unclassified 2975 

Ich möchte Entferne alle Zeilen, die den gleichen Wert in der ‚Gesamt‘ Spalte aufweisen und eine höhere ‚rankID‘ (in diesem Fall: 0,2. 1.1.1; 0.2.1.1.1.1; 0.2.1.1.2.1; 0.2.1.1.2.1.1). Hinweis: Ich möchte nicht alle "nicht klassifiziert" in Taxon entfernen, weil diese Zeiten tatsächlich notwendig sind, um zu halten. Hier

ist das, was ich dachte, könnte funktionieren:

bact<- read.csv('cSSU_bacteria_full.csv') 
str(bact) 
bact$rankID <- factor(bact$rankID, ordered = TRUE) 

library(dplyr) 

bact %>% 
    filter(!(any(order(levels(rankID)) < order(levels(rankID)) & total == total))) 

Ziel redundante Zeilen zu entfernen ist, halten die niedrigsten Ebene Taxon, wenn die Summen gleich sind, also Taxa zu entfernen, die sich gegenseitig erklären, aber man klassifiziert (hat einen Namen) und die anderen sind nicht.

Vielen Dank im Voraus.

Antwort

0

Ihr rankID besteht aus zwei Komponenten. Der erste ist, wie lange die Rang-ID ist. Zum Beispiel hat die zweite Zeile eine Stringlänge von 7. Wir können das zu unserem Vorteil nutzen. Gemäß Ihren obigen Daten ist der Gesamtbetrag mit der höchsten Anzahl von Zeichen der niedrigste Rang. Die andere Komponente ist die Summe der Zahlen im rankID. Kein Rang hat die gleiche Zeichenlänge und die gleiche Summe der Zahlen. Zum Glück brauchen wir dazu nur die Stringlänge. Dazu müssen Sie sicherstellen, dass rankID tatsächlich eine Zeichenfolge und kein Faktor ist.

bact %>% 
mutate(StringLength = nchar(rankID, type = 'char')) %>% 
group_by(total) %>% 
filter(StringLength == max(StringLength)) 

Dies sollte den Trick tun.

Verwandte Themen