我试图找到解决方案几个小时。我试图搜索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
我想要一个新列,其中列出了每个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
表示。
答案 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))