2015-05-22 3 views
7

Ich habe Daten für verschiedene Gewebe wie soeine Funktion kombinieren und für Schleife

tissueA tissueB tissueC 
gene1 4.5 6.2 5.8 
gene2 3.2 4.7 6.6 

Und ich möchte eine Auswertungsstatistik berechnen, die

x = Σ [1-log2(i,j)/log2(i,max)]/n-1 

ist, wobei n die Anzahl von Geweben (hier es ist 3), (i, max) ist der höchste Wert für das Gen i über die n Gewebe (dh für Gen1 ist es 6,2).

Da ich für jedes Gewebe, diese Berechnung zu tun haben, für jedes Gen (als die Summe aus j bis n geht, und j = 1) und erhalten dann die Summe dieser

habe ich eine for-Schleife

aber ich bin mir nicht sicher, wie man diese for-Schleife für jede Zeile anwenden würde, normalerweise würde ich eine Funktion schreiben und tun (apply, 1, function (x)), aber ich bin mir nicht sicher, wie eine for-Schleife sein kann in eine Funktion verwandelt.

Für erwartete Ausgabe für gene1 zum Beispiel wäre es

, dies
(1-log2(4.5)/log2(6.2))/2 + (1-log2(5.8)/log2(6.2))/2 =0.1060983 
+0

Bitte die erwartete Ausgabe hinzufügen. – zx8754

+0

Sicher! Tut mir leid, ich habe Fehler in meinen Klammern in meiner ursprünglichen for-Schleife, aber ich habe das geändert. Die Antwort für jedes Gen sollte im Bereich von 0 bis 1 – user3816990

+1

liegen (1-log2 (4,5)/log2 (6,2))/2 + (1-log2 (5,8)/log2 (6,2))/2 'ist gleich "0,1060983" , wie bekommst du '0.098'? – zx8754

Antwort

5

Versuchen:

#data 
df <- read.table(text=" tissueA tissueB tissueC 
gene1 4.5 6.2 5.8 
       gene2 3.2 4.7 6.6") 

#result 
apply(df,1,function(i){ 
    my.max <- max(i) 
    my.statistic <- 
    (1-log2(i)/log2(my.max)) 
    my.sum <- sum(my.statistic) 
    my.answer <- my.sum/(length(i)-1) 
    my.answer 
}) 

#result 
#  gene1  gene2 
# 0.1060983 0.2817665 
6

Nur für den Fall, wenn Sie eine große Datenmenge haben, können Sie plyr die verwenden können adply() die ist schneller im Vergleich zu apply()

library(plyr) 
adply(df, 1, function(x) 
data.frame(my.stat = sum(1-log2((x[,x != max(x)]))/log2(max(x)))/(length(x)-1))) 

#tissueA tissueB tissueC my.stat 
#1  4.5  6.2  5.8 0.1060983 
#2  3.2  4.7  6.6 0.2817665 
Verwandte Themen