R循环用于将方程应用于每个唯一类别

时间:2013-11-04 15:44:32

标签: r loops stat genetics

我正在寻求帮助写一个R循环来计算shannon的信息内容(SIC) 对于每个独特的单倍型。数据包括第1列中的单倍型和第2列中单倍型的频率。正如您在仅具有4种独特单倍型的示例数据中所见,每种单倍型存在不同数量,频率对应于每种单倍型。所有单倍型H *的频率总和为1.SIC的等式是

Σi(πhi* log(1 /(πhi)))

其中πhi是hi单倍型的频率

SIC Equation

Haplotype   Frequency
H1  0.8278
H1  0.02248
H1  0.1494
H2  0.8238
H2  0.02248
H2  0.1497
H3  0.1497
H3  0.02248
H3  0.8244
H4  0.628
H4  0.02248
H4  0.1483
H4  0.1637
H4  0.01081
H4  0.01798

在此示例中,H1的SIC为

(π* 0.8278 * log(1/(π* 0.8278)))+(π* 0.02248 * log(1 /(π* 0.02248)))+(π* 0.1494 * log(1 /(π* 0.1494) )))

并且最终输出应该给出4个SIC值,一个对应于每个独特的单倍型。

我相信使用lapply()是正确的方法,但我的R技能非常基本,知道接下来该做什么。感谢您的任何帮助。

2 个答案:

答案 0 :(得分:2)

您想要aggregate

result <- aggregate(df, by = list(df$Haplotype), function (h) sic(h[2]))

答案 1 :(得分:2)

library(plyr)
ddply(df1,.(Haplotype),summarize,mysum=sum(pi*Frequency*log(1/(pi*Frequency))))
  Haplotype      mysum
1        H1 -1.9433259
2        H2 -1.9190102
3        H3 -1.9226882
4        H4 -0.1784109

library(data.table)
dt1<-data.table(df1)
dt1[,list(sum=sum(pi*Frequency*log(1/(pi*Frequency)))),by=Haplotype]
   Haplotype        sum
1:        H1 -1.9433259
2:        H2 -1.9190102
3:        H3 -1.9226882
4:        H4 -0.1784109