Доступ к другим группам group_by с помощью summary()

#r #dplyr #group-by #summarize

#r #dplyr #группировка по #суммировать

Вопрос:

У меня есть фрейм данных со столбцами genes, областью хромосомы, к которой они принадлежат, клеточной линией, в которой была измерена экспрессия гена, и уровнем экспрессии гена в этой клеточной линии — это выглядит примерно так:

 gene    region    cell_line    expression
A       X         Joe          1
B       X         Joe          2 
C       Y         Joe          2
D       Z         Joe          3
E       Z         Joe          0
A       X         Claire       2
B       X         Claire       1
C       Y         Claire       3
D       Z         Claire       3
E       Z         Claire       1
  

Что я хочу сделать, так это для каждой строки ячейки вычислить среднее значение, стандартное отклонение и т.д. для хромосомной области всех генов, НЕ входящих в данную область. Итак, для области X Джо, например, я хочу, чтобы в строке вывода «summary()» отображалось среднее значение экспрессии для всех генов, НЕ входящих в X Джо (т. е. генов C, D, E Джо).

Таким образом, результат выглядит примерно так:

 region    cell_line     mean_other    standard_deviation_other   
X         Joe           1.67          some number
Y         Joe           1.5           some number
Z         Joe           1.67          some number
X         Claire        2.33          some number
Y         Claire        2.33          some number
Z         Claire        2             some number
  

Моя идея состояла бы в том, чтобы сделать следующее, за исключением того, что я понятия не имею, как заставить summary манипулировать группами за пределами той, с которой он «работает» в данный момент времени.

 df %>% group_by(region, cell_line) %>% 
 summarize(mean_other = mean(expression of cell lines not in this group),
           standard_deviation_other = var(expression of cell lines not in this group)
  

Ответ №1:

Мы можем использовать new dplyr::group_modify() для простого применения функции между группами, которая принимает каждую группу в качестве фрейма данных. Тогда мы можем просто использовать dplyr::anti_join() в исходном фрейме данных и применить все, что вы хотели в своем summary.

Используя mtcars :

 library(dplyr)

mtcars %>%
  group_by(cyl) %>%
  group_modify(~anti_join(mtcars, .) %>%
                 summarize(disp_m = mean(disp),
                           disp_sd = sd(disp)))
#> # A tibble: 3 x 3
#> # Groups:   cyl [3]
#>     cyl disp_m disp_sd
#>   <dbl>  <dbl>   <dbl>
#> 1     4   297.   101. 
#> 2     6   244.   136. 
#> 3     8   136.    50.7
  

И проверка наличия первой группы с помощью cyl == 4 :

 mtcars %>%
  filter(cyl != 4) %>%
  summarize(disp_m = mean(disp),
            disp_sd = sd(disp))
#>     disp_m  disp_sd
#> 1 296.5048 101.1434
  

На вашем df это должно выглядеть следующим образом:

 df %>%
  group_by(region, cell_line) %>%
  group_modify(~anti_join(df, .) %>%
               summarize(mean_other = mean(expression),
                         sd_other = var(expression)))
  

Комментарии:

1. Спасибо за ответ! Есть только одна вещь, которую мне следовало бы более тщательно описать в моем проекте кода, но я не думаю, что это поможет — я бы хотел, чтобы mean_other и sd_other вычислялись из других регионов в пределах той же строки ячеек, и, хотя group_modify и anti_join очень полезны, я не совсем понимаю, как их использовать, чтобы преодолеть этот конкретный блокпост