#r #dplyr #group-by #summarize #rowsum
#r #dplyr #группировать по #подведите итог #сумма строк
Вопрос:
Алоха,
Я пытаюсь получить общее количество для каждого имени строки в моей матрице выборки. По какой-то причине я пробовал оба rowsum, а затем преобразовывал в фрейм данных и использовал dplyr::group_by, но они выдают ошибки. Вот подмножество примеров данных:
mat = matrix(c(0,1,2,3,4), nrow=3, ncol = 5)
rownames(mat) <- c("CHO", "NO", "O")
colnames(mat) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")`
Я хотел бы иметь результирующий фрейм данных с именем формулы, тогда сумма наблюдений по выборкам и процентная формула выборки наблюдались в целом.
Это кажется достаточно простым, но я перепробовал все различные комбинации агрегирования данных безрезультатно и был бы очень признателен за некоторые рекомендации.
Комментарии:
1. У вас есть уникальные имена строк. Неясно, что вы хотите агрегировать
2. Вам нужно
rowSums(mat)
3. Каков ваш ожидаемый результат для
mat
того, чем вы поделились? Вы хотите суммировать данные по строкам?
Ответ №1:
Нам может понадобиться только rowSums
rowSums(mat)
Если есть повторяющиеся имена строк (в данных примера имена строк уникальны), тогда мы используем rowsum
with group
, указанный как rownames
rowsum(mat, row.names(mat))
и затем мы используем rowSums
поверх этого
rowSums(rowsum(mat, row.names(mat)))
Ответ №2:
Ответ от @akrun делает именно то, что задает плакат, но я часто нахожусь в похожей, но немного иной ситуации, но с фреймом данных, который имеет то, что было бы повторяющимися именами строк в матрице, так что теперь это значения в столбце (называемые «составными» ниже), например:
set.seed(2347813)
df <- data.frame(matrix(sample(c(0,1,2,3,4,5,6,7,8,9),
size=30, replace=T), nrow=6, ncol=5))
colnames(df) <- c("sample_1", "sample_2", "sample_3", "sample_4", "sample_5")
df$compound <- c("CHO", "NO", "O", "CHO", "NO", "O")
который выглядит как:
sample_1 sample_2 sample_3 sample_4 sample_5 compound
1 0 1 4 9 1 CHO
2 3 8 3 0 5 NO
3 8 9 7 1 7 O
4 8 2 9 7 7 CHO
5 3 8 9 0 5 NO
6 6 1 6 7 5 O
затем я хочу суммировать данные различными способами, но я хочу сгруппировать их по составным частям и использовать конвейер ( %>%
ниже) из dplyr / tidyverse.
как и в исходном вопросе, если мы хотим получить общее количество по составу, мы бы сделали:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))))
что дало бы нам:
compound total
<chr> <dbl>
1 CHO 48
2 NO 44
3 O 57
но я думаю, что лучшая часть — это возможность выполнять несколько операций суммирования одновременно. допустим, нам нужно общее, среднее, стандартное отклонение и среднее значение только для sample_1 через sample_3, мы можем получить все это в одной конвейерной команде:
df %>%
group_by(compound) %>%
summarize(total=sum(c_across(starts_with("sample"))),
grand_mean=mean(c_across(starts_with("sample"))),
sd=sd(c_across(starts_with("sample"))),
mean_13=mean(c_across(sample_1:sample_3))) # mean of sample 1-3
что дает нам:
# A tibble: 3 x 5
compound total grand_mean sd mean_13
<chr> <dbl> <dbl> <dbl> <dbl>
1 CHO 48 4.8 3.58 4
2 NO 44 4.4 3.20 5.67
3 O 57 5.7 2.71 6.17
комбинируя pipeline ( %>%
), group_by
, mutate
, и новые версии across
(которые я использовал выше c_across
), вы можете многое сделать за один раз.