【问题标题】:Compute statistics based on grouping of data.frame基于 data.frame 的分组计算统计数据
【发布时间】:2017-08-28 18:25:41
【问题描述】:

我有以下 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 中所示,每个 signal_window 可以有多个 gene_symbol 值。现在,对于每个signal_window 中的每个gene_symbol,我想计算1/signal_dist_to_gene。我想使用此值来计算每个signal_window 中每个gene_symbol 的每个1/signal_dist_to_gene 的总和。

例如,对于窗口 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 进行计算?

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    应该这样做。首先我们按 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))
    

    【讨论】:

      【解决方案2】:

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

      如果您希望每个重复的符号在 signal_window 中被唯一处理,您可以从 group_by 中删除 gene_symbol,或者如果您希望将它们分组,则保留它。

      这就是你所追求的吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2013-07-07
        • 1970-01-01
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        相关资源
        最近更新 更多