2015-10-28 100 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

请为您的答案添加解释,让人们更容易理解。 –

相关问题