2013-11-04 12 views
1

我正在尋求幫助編寫R循環來計算每個獨特單體型的Shannon信息內容(SIC) 。數據包括第1列的單倍型和第2列的單倍型頻率。正如您在僅有4種獨特單倍型的示例數據中所看到的,每種單倍型的數目不同,頻率與每種單倍型相對應。高達1.對於所有單倍型H *和的頻率爲SIC的方程是用於將方程應用於每個唯一類別的R循環

ΣI(πhi*日誌(1 /(π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 

在這個例子中,SIC爲H1將是

(π* 0.8278 *日誌(1 /(π* 0.8278)))+(π* 0.02248 *日誌(1 /( π* 0.02248)))+(π* 0.1494 * 1 og(1 /(π* 0.1494)))

並且最終輸出應該給出4個SIC值,一個對應於每個獨特的單體型。

我相信使用lapply()是前進的正確方法,但是我的R技能是知道接下來要做什麼的基本知識。感謝您的任何幫助。

回答

2

你想aggregate

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

謝謝你的建議。我已代碼寫爲:
SIC < - 函數(P) { 總和(LOG2(1/P)×P) }
結果< - 骨料(DF,由=列表(DF $單倍型),函數(H)原文如此(H [2]))
但它給該消息: 錯誤在1/p:非數字參數二元運算
相信代碼後 '功能'是不正確的。如果我已將「sic」指定爲函數,我是否需要這個? – user2895292

+0

我簡化了一些簡化 - 但我的代碼*不工作。唯一的問題是它也試圖將轉換應用到你明顯不想要的'Haplotype'列。但是,這給了我一個警告,而不是你的錯誤。 –

+0

好吧我相信我現在得到的警告和你現在一樣「在Ops.factor(log2(1/p),p):/對因素沒有意義」。所以我只需要將該功能指向頻率列。我可以問一下代碼的「sic(h [2])」部分是幹什麼的?它是否告訴R將函數「sic」指向數據集的第2列? – user2895292

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 
+1

謝謝你的代碼;他們獲得了與「結果< - 聚合(frq $ Frequency〜frq $ Haplotype,data = frq,FUN = sic)」相同的結果,從而證實了這些工作:D – user2895292