dplyr: group_by, суммировать различные столбцы и применять функцию на основе сгруппированных сумм строк?

#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 бы была возможность перезаписать исходные столбцы без необходимости сохранять их имена одинаковыми.