我想从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()
家族中的行式运营商。由于它们的大多数输出看起来都是矩阵或列表或向量,因此它们似乎并不适合完成任务。我的目标是得到一个统计数据:均值。我也可能对标准偏差感兴趣,但现在不太重要了。
任何有正确方向的提示都会受到赞赏!
答案 0 :(得分:2)
你甚至不需要apply()
。 R中的大多数运营商以矢量化方式运行。因此,如果您的数据位于名为dd
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)