r - 结合一个函数和 for 循环

标签 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 的最高值,(即基因 1 是 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 循环变成一个函数。

例如,对于基因 1 的预期输出,它将是
(1-log2(4.5)/log2(6.2))/2 + (1-log2(5.8)/log2(6.2))/2 =0.1060983

最佳答案

以防万一如果你有一个庞大的数据集,你可以使用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

关于r - 结合一个函数和 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398514/

相关文章:

r - 如何根据变量大小而不是层大小计算 geom_flow() 中的百分比

Rsolnp : In cbind(temp, funv) :结果的行数不是向量长度(arg 1)的倍数

r - 在 ddply 汇总之前从数据帧中选择范围(时间戳)

r - 函数内的并行 *ply

r - 如何在每一行应用库命令并创建新变量

使用 Shiny 从 Azure 刷新 token

r - 使用 colnames 作为变量构造函数

python - 加快 Pandas 应用功能

R 在矩阵上使用 sapply 时保留列名和行名

r - 在 R 中测试比例赔率假设