如何用R语言按plot_id分组统计不同胸径等级的树木数量?
解决方案:按地块分组统计大树/小树数量并重复显示到每行
核心代码
使用dplyr包的分组+新增列操作,直接在原数据中生成每个地块的统计值并自动重复到对应行:
library(dplyr) # 加载数据后执行以下代码 trees_data <- trees_data %>% group_by(plot_id) %>% mutate( # 统计当前地块中dbh_cm>31.5的大树数量 BigTree = sum(dbh_cm > 31.5, na.rm = TRUE), # 统计当前地块中dbh_cm<31.5的小树数量 smalltree = sum(dbh_cm < 31.5, na.rm = TRUE) ) %>% ungroup() # 取消分组,避免后续操作受分组影响
代码说明
group_by(plot_id):将数据按地块ID分组,后续所有计算都基于单个地块完成mutate():在原数据框中新增列,而非压缩数据行数,因此每个地块的统计值会自动填充到该地块的每一行sum(dbh_cm > 31.5, na.rm = TRUE):R中逻辑值TRUE等价于1、FALSE等价于0,sum即可统计符合条件的树木数量;na.rm=TRUE用于处理可能存在的缺失值,防止结果变为NAungroup():完成分组计算后取消分组,避免后续对全数据集操作时默认按地块分组
运行结果示例
针对你提供的示例数据,运行后关键列结果如下:
plot_id species dbh_cm BigTree smalltree SH_001N CADE 13 3 5 SH_001N CADE 14.4 3 5 SH_001N CADE 11.3 3 5 SH_001N PILA 12.1 3 5 SH_001N PILA 23.8 3 5 SH_001N CADE 91.2 3 5 SH_001N QUKE 74 3 5 SH_001N CADE 116.5 3 5 SH_19 CADE 35.7 4 1 SH_19 CADE 24.2 4 1 SH_19 PIPO 38.6 4 1 SH_19 PIPO 44.2 4 1 SH_19 CADE 38.9 4 1
原代码问题分析
- 第一段代码直接计算全数据集的符合条件行数,未按地块分组,导致所有行的统计值完全相同,不符合需求
- 第二段代码使用
summarise(across(...))的写法错误:across用于对多列批量应用函数,但此处需求是统计行数;且summarise会将每个地块压缩为一行,无法保留原数据的所有行并重复统计值
内容的提问来源于stack exchange,提问作者Lilbunny
相关产品推荐
相关产品推荐

