Как рассчитать среднюю разницу между одним значением и всеми остальными в группе в r

#r #dplyr #group-by

#r #dplyr #группировка по

Вопрос:

У меня есть набор данных генов в группах, и у каждого гена есть оценка:

  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() и не собираюсь возвращаться только к использованию моего гена top score.

Входные данные:

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

Ответ №1:

Даст ли это вам то, что вам нужно? Похоже, что для каждой группы вы хотите получить различия между max оценкой и каждой оценкой. Тогда Avg_TopGene_Difference_Per_Locus это будет сумма этих различий, деленная на количество различий (минус 1). Обратите внимание, что вы можете добавить filter after group_by 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]