dplyr:group_by,对各个列求和,并应用基于分组行总和的函数?

dplyr: group_by, sum various columns, and apply a function based on grouped row sums?

我正在尝试使用 dplyr 来总结一个在某种程度上支离破碎的森林中鸟类物种丰度的数据框。

第一列 percent_cover 有 4 个可能的值:10、25、50、75。然后有十列鸟类数量:'species1' 到 'species10'。

我想按 percent_cover 分组,然后对其他列求和并计算这些总和占 4 行总和的百分比。

获得列总和很容易:


%>% group_by(Percent_cover) %>% summarise_at(vars(contains("species")), sum)


...但我需要的是 sum/rowSum*100。似乎需要某种'rowwise'操作。

此外,出于兴趣,为什么以下不起作用?


%>% group_by(Percent_cover) %>% summarise_at(vars(contains("species")), sum*100)


在这一点上,很想回到 'for' 循环....或 Excel 数据透视表。

要使用 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.