R:计算列中值的分数,按另一列中的值分组

时间:2015-10-28 23:49:09

标签: r

我试图找到解决方案几个小时。我试图搜索SO,如果我忽略了这个问题的答案,请将其作为副本关闭。

我有一个矩阵,按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

我想要一个新列,其中列出了每个exprtranscript_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表示。

2 个答案:

答案 0 :(得分:3)

data.table的一种方式:

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

答案 1 :(得分:2)

为了解决你的问题,请考虑

1.将您的transcript_id列分组

2.使用 dplyr plyr 两种方式创建所需的列,我写了两种方式。

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))