2017-01-02 10 views
-3

Ich habe eine große data.frame mit genomischen Daten. Die Daten sehen wie folgt aus: colnames(df)=c("id","chr","start","end","log2") wo ID ist der Name der Probe, CHR ist die Nummer des Chromosoms, Start und Ende geben Sie mir die Position auf dem Chromosom, und log2 ist, wie hoch/niedrig war das Lesen in dieser Position.mit Tapply in Tapply

Da es viele Daten gibt, und es ist schwer zu verstehen, was vor sich geht, versuche ich über jede Probe (id) zu gehen, und für jedes Chromosom (chr) möchte ich den Median von log2 berechnen Segmente, sagen wir mal alle Lesungen zwischen 1 bis 10^7, 1 + 10^7 bis 2 * 10^7 und so weiter.

Das Ergebnis sollte eine neue data.frame sein, für jede Probe und jedes Chromosom sollte ich mehrere Zeilen haben, wobei Start und Ende angeben, welches Segment ich bin, und der letzte Wert wird der Median dieses Segments sein.

Ich denke, ich muss tapply() verwenden und gehen Sie über Proben, und darin tapply() und gehen Sie über die Chromosomen und dann in jedem Chromosom, eine Schleife über "Start" -Position? (Lassen Sie mich sagen, dass es mir nur wichtig ist, wenn die Startkoordinate im Bereich liegt.) Nicht sicher, wie genau ich das angehen soll.

Alle Hinweise, Tipps, Anweisungen werden sehr geschätzt.

Reproduzierbare Beispiel-

# fabricated data, 4 samples 
# 24 chromosomes in each sample 
# 61 ranges in each chromosome 

df <- data.frame(id = rep(c('F1','F2','M1','M2'), each = 24*61), 
       chr = rep(rep(c(1:22,'x','y'), each = 61),4), 
       start = rep(seq(1,25*10^6 - 99, length.out = 61),times = 24*4), 
       end = rep(seq(100,25*10^6, length.out = 61),times = 24*4), 
       log2 = rnorm(4*24*61)) 

# output should look something like this- 
id  chr  start end  median_log_2 
"F1" "1"  1  8000000 0.002 
"F1" "1"  8000001 16000000 0.00089 
"F1" "1"  16000001 24000000 -0.0011 
"F1" "1"  24000000 25000000 0.108 
"F1" "2"  1  8000000 -0.0012 
"F1" "2"  8000001 16000000 0.0089 
"F1" "2"  16000001 24000000 0.00311 
"F1" "2"  24000000 25000000 0.0128 
... 
... 
+0

Anstatt mit Worten zu beschreiben, einfach ein [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) und erwartete Ausgabe. – Sotos

+0

Ich füge ein reproduzierbares Beispiel hinzu (wie du gerne fragst), aber ich glaube wirklich nicht, dass dies etwas klarer machen wird. –

+0

Was meinst du "wie ich gerne fragen" ??? Sie denken, es ist eine persönliche Entscheidung? oder dass ich versuche dich zu "schikanieren"? Ich versuche Ihnen zu helfen (gut war) und reproduzierbares Beispiel und erwartete Ausgabe macht es mir (und anderen) leichter, Ihnen zu helfen. Sie haben hier 16 Fragen in SO gestellt. Ich sollte Ihnen solche Sachen NICHT sagen müssen und Sie sollten solche Kommentare NICHT machen. – Sotos

Antwort

0
median_data <- tapply(df$log2, 
         list(df$id, 
          df$chr, 
          cut(df$start, c(0,8*10^6,1.6*10^7,2.4*10^7,3.2*10^7,4*10^8))), 
         median) 
median_data <- as.data.frame.table(median_data) 

hat seinen Zweck erfüllt. (Die Ausgabe ist nicht im richtigen Format, aber für mich ist es eng genug)

In tapply() können Sie durch mehr als ein Argument unter Verwendung von list() Teilmenge.

Verwandte Themen