2015-05-22 29 views
7

ho dati per diversi tessuti in questo modoCombina una funzione e ciclo for

tissueA tissueB tissueC 
gene1 4.5 6.2 5.8 
gene2 3.2 4.7 6.6 

E voglio calcolare una statistica riassuntiva che è

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

dove n è il numero di tessuti (qui è 3), (i, max) è il valore più alto per il gene i attraverso i n tessuti, (cioè per gene1 è 6.2).

Dal momento che ho a che fare questo calcolo per ogni tessuto per ogni gene (come la somma va da j per n, e j = 1) e quindi ottenere la somma di quel

ho scritto un ciclo for

tuttavia non sono sicuro di come applicare questo ciclo per ogni riga, normalmente vorrei scrivere una funzione e basta fare (applicare, 1, funzione (x)) ma non sono sicuro di come un ciclo for può essere trasformato in una funzione.

Per l'uscita prevista per gene1, per esempio, sarebbe

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

Si prega di aggiungere l'uscita prevista. – zx8754

+0

Sicuro! Scusa, penso di aver avuto errori nelle parentesi nel mio ciclo originale, ma l'ho modificato. La risposta per ciascun gene dovrebbe variare da 0 a 1 – user3816990

+1

'(1-log2 (4.5)/log2 (6.2))/2 + (1-log2 (5.8)/log2 (6.2))/2' è uguale a' 0.1060983' , come stai ottenendo '0.098'? – zx8754

risposta

5

Prova questa:

#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

Solo nel caso se si dispone di un set di dati enorme, è possibile utilizzare plyr di adply() che è più veloce rispetto a 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