#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 очень полезны, я не совсем понимаю, как их использовать, чтобы преодолеть этот конкретный блокпост