我有以下data.frame,我想计算一些统计数据:
gene_symbol signal_window signal_score MEF_chRNA ES_chRNA signal_dist_to_gene
262764 GOT1 218220 0.08 0.2696089 0.3356937140 44805
403001 NKX2 218220 0.08 0.0000000 0.0008852885 42915
262630 GOT1 218221 0.08 0.2696089 0.3356937140 45005
403039 NKX2 218221 0.08 0.0000000 0.0008852885 42715
262793 GOT1 218222 0.00 0.2696089 0.3356937140 45205
402663 NKX2 218222 0.00 0.0000000 0.0008852885 42515
262867 GOT1 218223 0.16 0.2696089 0.3356937140 45405
402737 NKX2 218223 0.16 0.0000000 0.0008852885 42315
262677 GOT1 218224 0.16 0.2696089 0.3356937140 45605
403006 NKX2 218224 0.16 0.0000000 0.0008852885 42115
262858 GOT1 218225 0.16 0.2696089 0.3356937140 45805
402953 NKX2 218225 0.16 0.0000000 0.0008852885 41915
如示例data.frame中所示,每个gene_symbol
可以有多个signal_window
值。现在,对于每个gene_symbol
中的每个signal_window
,我想计算1/signal_dist_to_gene
。我想使用此值来计算每个1/signal_dist_to_gene
中每个gene_symbol
的每个signal_window
的总和。
例如,对于窗口218220,有两个基因。对于我想要计算的每个基因:
gene_weight_GOT1 = (1/signal_dist_to_gene_GOT1) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
gene_weight_NKX2 = (1/signal_dist_to_gene_NKX2) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
我最终想要使用这些gene_weight
变量来计算:
MEF_prop = [MEF_chRNA_GOT1 * gene_weight_GOT1 * 1/2 + MEF_chRNA_NKX2 * gene_weight_NKX2 * 1/2] / [gene_weight_GOT1 * (MEF_chRNA_GOT1/2 + ES_chRNA_GOT1/2) + gene_weight_NKX2 * (MEF_chRNA_NKX2/2 + ES_chRNA_NKX2/2)]
没有人知道在同一个窗口中总会有2个基因。有些情况下没有基因(NA)和其他有20多个基因的情况。 有没有一种简单的方法可以使用plyr或dplyr进行计算?
答案 0 :(得分:2)
这应该这样做。首先,我们按signal_window分组,然后按照您指定的方式计算权重。分母中的sum
是通过组计算的(signal_window)
library(tidyverse)
df %>%
group_by(signal_window) %>%
mutate(gene_weight = (1 / signal_dist_to_gene) / sum(1/signal_dist_to_gene))
答案 1 :(得分:0)
标准dplyr语法data.df %>% group_by() %>% mutate()
对于您正在尝试的内容应该非常简单。
您的代码可能最终看起来像这样:
data.df %>%
group_by(signal_window, gene_symbol) %>%
mutate(gene_weight = (1/signal_dist_to_gene) / sum(1/signal_dist_to_gene)) %>%
mutate(MEF_prop = (MEF_chRNA * gene_weight * 1/2 + MEF_chRNA * gene_weight * 1/2) / (gene_weight * (MEF_chRNA/2 + ES_chRNA/2) + gene_weight * (MEF_chRNA/2 + ES_chRNA/2)))
如果您希望在gene_symbol
内唯一地处理每个重复的符号,则可以从group_by
删除signal_window
,或者如果您希望将它们分组,则可以将其保留。{/ p>
这就是你要追求的吗?