如何用dplyr计算各watername下含≤200长度观测的站点占比?
使用dplyr计算分组内符合条件站点的占比
完全可以用dplyr实现这个需求,核心思路是先对每个站点判断是否存在符合条件的观测,再按水体分组计算占比,具体代码如下:
方法一:保留中间统计列
library(dplyr) # 假设你的数据框名为df result <- df %>% # 按水体名称和站点ID分组,标记该站点是否存在length≤200的观测 group_by(watername, siteid) %>% mutate(has_short = any(length <= 200, na.rm = TRUE)) %>% # 去重,每个站点仅保留一条记录 distinct(watername, siteid, has_short) %>% # 按水体名称重新分组,计算占比 group_by(watername) %>% summarise( 总站点数 = n(), 符合条件站点数 = sum(has_short), 符合条件占比 = (符合条件站点数 / 总站点数) * 100 )
方法二:直接输出百分比
如果不需要中间的总站点数和符合条件站点数,可以简化为:
result <- df %>% group_by(watername, siteid) %>% # 标记站点是否符合条件,同时移除siteid分组 summarise(has_short = any(length <= 200, na.rm = TRUE), .groups = "drop_last") %>% # 计算符合条件站点的占比 summarise(符合条件占比 = (sum(has_short) / n()) * 100)
关键逻辑说明
any(length <= 200, na.rm = TRUE):判断当前站点的所有观测中,是否至少有一条满足length≤200,na.rm=TRUE用于忽略length字段的缺失值.groups = "drop_last":在第一次分组汇总后,移除最内层的siteid分组,只保留watername分组,方便后续计算整体占比
内容的提问来源于stack exchange,提问作者Ryan Gary
相关产品推荐
相关产品推荐

