#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]