#r #dplyr #summarize
#r #dplyr #суммировать
Вопрос:
Я пытаюсь использовать dplyr для суммирования данных о численности видов птиц в лесах, которые в некоторой степени фрагментированы.
Первый столбец, percent_cover, имеет 4 возможных значения: 10, 25, 50, 75. Затем есть десять столбцов с подсчетом видов птиц: от ‘species1’ до ‘species10’.
Я хочу сгруппировать по percent_cover, затем суммировать другие столбцы и вычислить эти суммы в процентах от сумм 4 строк.
Добраться до сумм столбцов достаточно просто:
%>% group_by(Percent_cover) %>% summarise_at(переменные (содержит («виды»)), сумма)
…но что мне нужно, так это sum / rowSum * 100 . Похоже, что требуется какая-то операция «по строкам».
Кроме того, из интереса, почему следующее не работает?
%>% group_by(Percent_cover) %>% summarise_at(переменные (содержит («виды»)), сумма * 100)
На этом этапе возникает соблазн вернуться к циклам «для» …. или сводным таблицам Excel.
Ответ №1:
Для использования dplyr
попробуйте следующее :
library(dplyr)
df %>%
group_by(Percent_cover) %>%
summarise(across(contains("species"), sum)) %>%
mutate(rs = rowSums(select(., contains("species")))) %>%
mutate(across(contains('species'), ~./rs * 100)) -> result
result
Например, используя mtcars
:
mtcars %>%
group_by(cyl) %>%
summarise(across(disp:wt, sum)) %>%
mutate(rs = rowSums(select(., disp:wt))) %>%
mutate(across(disp:wt, ~./rs * 100))
# cyl disp hp drat wt rs
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 54.2 42.6 2.10 1.18 2135.
#2 6 58.7 39.2 1.15 0.998 2186.
#3 8 62.0 36.7 0.567 0.702 7974.
Комментарии:
1. Очень хороший Ronak. Стоит добавить a
.names = "{col}_percent"
в свой финалacross
для ясности?2. Это хорошее предложение для ясности. Тем не менее, это сохранит исходные столбцы как есть и создаст новый столбец с этими новыми именами.
3. Да, было бы неплохо, если
across
бы была возможность перезаписать исходные столбцы без необходимости сохранять их имена одинаковыми.