2015-10-28 132 views
1

我試圖找幾個小時的解決方案。我試圖搜索過,如果我忽略了這個問題的答案,請將其作爲重複關閉。R:計算列中值的分數,按另一列中的值進行分組

我有一個矩陣,通過transcript_id排序,然後cond

transcript_id cond expr 
A1    B1  40 
A1    B2  30 
A1    B3  20 
A2    B2  35 
A2    B3  45 
A3    B1  23 
A4    B1  64 
A4    B3  43 

我想一個新列,其中expr每個transcript_id內的部分列出:

transcript_id cond expr frac 
A1    B1  40  0.4444 
A1    B2  30  0.3333 
A1    B3  20  0.2222 
A2    B2  35  0.4375 
A2    B3  45  0.5625 
A3    B1  23  1 
A4    B1  64  0.5981 
A4    B3  43  0.4019 

有一個聰明的方法來實現這個?

我天真的做法是編寫一個函數,循環每個獨特的元素在transcript_id,但我卡住了。 請注意,並非每個transcript_id都由全部三個cond表示。與data.table

+1

非常相似,這從另一個天:http://stackoverflow.com/questions/33335398/how-can-repeatedly-subtract-the-rows-of-a-data-matrix-in- r/3333629 - 使用'ave'在每個組中進行計算:'with(dat,ave(expr,transcript_id,FUN = prop.table))' – thelatemail

回答

2

方式一:

library(data.table) 
#setDT converts to a data.table and then you calculate the fraction of each expr 
#grouping by the transcript_id 
setDT(df)[, frac := expr/sum(expr), by=transcript_id] 

輸出:

> df 
    transcript_id cond expr  frac 
1:   A1 B1 40 0.4444444 
2:   A1 B2 30 0.3333333 
3:   A1 B3 20 0.2222222 
4:   A2 B2 35 0.4375000 
5:   A2 B3 45 0.5625000 
6:   A3 B1 23 1.0000000 
7:   A4 B1 64 0.5981308 
8:   A4 B3 43 0.4018692 
+0

謝謝。我真的需要很快研究data.table-package! –

+1

Np,很高興我能幫上忙。這是值得你花時間,我向你保證。如果你也有一張大桌子,速度非常快。 – LyzandeR

0

爲解決找你問題考慮

1.group的你transcript_id列

2。使用兩種方式創建您所需的列dplyrplyr包,我寫了兩種方式。

using ***dplyr***. 

dataset %>% 
      dplyr::group_by (transcript_id) %>% 
      dplyr::mutate(frac=round(expr/sum(expr),4)) 




using ***plyr***. 

plyr::ddply(dataset,.(transcript_id),plyr::summarise,frac = 
               round(expr/sum(expr),4)) 
+0

請爲您的答案添加解釋,讓人們更容易理解。 –

相關問題