结合函数和for循环

时间:2015-05-22 13:51:52

标签: r plyr apply bioinformatics

我有不同组织的数据,如此

 tissueA tissueB tissueC
gene1    4.5 6.2 5.8
gene2    3.2 4.7 6.6

我想计算一个

的摘要统计量
x = Σ [1-log2(i,j)/log2(i,max)]/n-1

其中n是组织的数量(这里是3),(i,max)是n组织中基因i的最高值(即gene1为6.2)。

因为我必须为每个基因的每个组织做这个计算(因为总和从j到n,并且j = 1)然后得到它的总和

我写了一个for循环

for (i in seq_along(x) {
my.max <- max(x[,i])
my.statistic <- (1-log2(x[,i]/log2[my.max])
my.sum <- sum(my.statistic)
my.answer <- my.sum/2 #(n-1=3-1=2)

但是我不知道如何为每一行应用这个for循环,通常我会编写一个函数并且只执行(apply,1,function(x))但我不确定如何将for循环转换为一个功能。

例如,对于gene1的预期输出,它将是

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

2 个答案:

答案 0 :(得分:6)

万一你拥有庞大的数据集,你可以使用plyr的adply(),这比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

答案 1 :(得分:5)

试试这个:

#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