r - dplyr:group_by,对各个列求和,并应用基于分组行总和的函数?
问题描述
我正在尝试使用 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。似乎需要某种“逐行”操作。
另外,出于兴趣,为什么以下不起作用?
%>% 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.
推荐阅读
- python - Python 2:下一个输入行未显示
- python - 如何从 csv 文件中的数据更新 3D quiver FuncAnimation?
- javascript - 如果一段时间后没有悬停或单击,如何隐藏和显示 div
- django - 将外部数据加载到管理模型中 - DJANGO
- java - Java,在要求输入时出现简单数学运算的错误
- python - Flask:如果在应用程序中访问了 url,则返回不同的页面
- r - 从公式调用中获取所有因子变量
- node.js - nodejs postgresql发送安全参数错误
- c# - 如何修改 c# 表单设计中发生的错误?
- google-cloud-platform - 需要排查 Bigtable 读取延迟问题