【问题标题】:How to calculate average difference between one value and all others in a group in r如何计算r中一组中一个值与所有其他值之间的平均差异
【发布时间】:2020-10-28 17:13:18
【问题描述】:

我有一个基因组数据集,每个基因都有一个分数:

 Group Gene      Score     
    1   AQP11    0.55     
    1   CLNS1A   0.2      
    1   RSF1     0.54       
    2   CFDP1    0.41      
    2   CHST6    0.42     
    3   ACE      0.63        
    3   NOS2     0.63         

我希望检查每组得分最高的基因,并查看该基因与其组中所有其他基因之间的平均得分差异。

以输出为例(请注意手工计算):

 Group Gene      Score     Avg_TopGene_Difference_Per_Locus
    1   AQP11    0.55              0.18    # difference of AQP11 score with the other genes: (0.35+0.01)/2
    1   CLNS1A   0.2               0.18
    1   RSF1     0.54              0.18
    2   CFDP1    0.41              ...
    2   CHST6    0.42      
    3   ACE      0.63          
    3   NOS2     0.63          

我正在尝试使用group_by()top_n 的组合,但我在进行实际差异计算方面并没有走得太远,因为diff() 是连续的,不会回去只使用我的最高分基因。

输入数据:

structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), Gene = c("AQP11", 
"CLNS1A", "RSF1", "CFDP1", "CHST6", "ACE", "NOS2"), Score = c(0.5566507, 
0.2811747, 0.5269924, 0.4186066, 0.4295135, 0.634, 0.6345), direct_count = c(4L, 
0L, 3L, 1L, 1L, 1L, 1L), secondary_count = c(5L, 2L, 6L, 2L, 
3L, 1L, 1L)), row.names = c(NA, -7L), class = c("data.table", 
"data.frame"))

【问题讨论】:

    标签: r dplyr group-by


    【解决方案1】:

    这能满足您的需要吗?听起来对于每个组,您都想获得max 分数和每个分数之间的差异。然后,Avg_TopGene_Difference_Per_Locus 将是这些差异的总和,除以差异的数量(减 1)。请注意,您可以在group_by 之后添加filter,以确保n() > 1 避免被零除(如果有可能)。

    library(tidyverse)
    
    df %>%
      group_by(Group) %>%
      mutate(diff = max(Score) - Score,
             Avg_TopGene_Difference_Per_Locus = sum(diff) / (n() - 1))
    

    输出

      Group Gene   Score direct_count secondary_count     diff Avg_TopGene_Difference_Per_Locus
      <int> <chr>  <dbl>        <int>           <int>    <dbl>                            <dbl>
    1     1 AQP11  0.557            4               5 0                                0.153   
    2     1 CLNS1A 0.281            0               2 0.275                            0.153   
    3     1 RSF1   0.527            3               6 0.0297                           0.153   
    4     2 CFDP1  0.419            1               2 0.0109                           0.0109  
    5     2 CHST6  0.430            1               3 0                                0.0109  
    6     3 ACE    0.634            1               1 0.000500                         0.000500
    7     3 NOS2   0.634            1               1 0                                0.000500
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table方法

      library(data.table)
      df[,  diff := max(Score) - Score, .(Group)][, 
            Avg_TopGene_Difference_Per_Locus = sum(Diff)/(.N - 1), Group]
      

      【讨论】:

        猜你喜欢
        • 2019-06-03
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        相关资源
        最近更新 更多