如何在R中执行行操作以生成单个统计信息

时间:2014-07-15 02:22:15

标签: r bioinformatics

我想从R中的数据帧计算平均值。该文件表示染色体(第1列)的范围(第2,3列)上的覆盖率(第4列)的输出。

数据如下所示:

V1  V2  V3   V4
 1  65  69  103
 1  69  70  107
 1  70  74  108
 1  74  75  110
 1  75  77  111
 1  77  78  113
 1  78  79  115
 1  79  80  118
 1  80  81  119

我想计算所有文件的平均覆盖率。在纸面上,这看起来像: [103 *(69-65)+107(70-69)+108(74-70)+ ... + V4(V3-V2)] /(lengthOfChromosome)

lengthOfChromosome已知。

我一直在寻找解决方案,而我发现的最接近的是apply()家族中的行式运营商。由于它们的大多数输出​​看起来都是矩​​阵或列表或向量,因此它们似乎并不适合完成任务。我的目标是得到一个统计数据:均值。我也可能对标准偏差感兴趣,但现在不太重要了。

任何有正确方向的提示都会受到赞赏!

2 个答案:

答案 0 :(得分:2)

你甚至不需要apply()。 R中的大多数运营商以矢量化方式运行。因此,如果您的数据位于名为dd

的data.frame中
dd<-structure(list(V1 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), V2 = c(65L, 
69L, 70L, 74L, 75L, 77L, 78L, 79L, 80L), V3 = c(69L, 70L, 74L, 
75L, 77L, 78L, 79L, 80L, 81L), V4 = c(103L, 107L, 108L, 110L, 
111L, 113L, 115L, 118L, 119L)), .Names = c("V1", "V2", "V3", 
"V4"), class = "data.frame", row.names = c(NA, -9L))

然后你可以用简单的

得到你方程的分子
with(dd, sum(V4*(V3-V2)))

(这里我们使用with()所以我们不必多次写dd$。)并且假设染色体的长度只是最大结束而不是最小开始那么

with(dd, sum(V4*(V3-V2))/(max(V3)-min(V2)))

答案 1 :(得分:1)

如果dat是您的data.frame且V1仅为1

with(dat, sum(V4*(V3-V2))) / (lengthOfChromosome)