You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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用于处理可能存在的缺失值,防止结果变为NA
  • ungroup():完成分组计算后取消分组,避免后续对全数据集操作时默认按地块分组

运行结果示例

针对你提供的示例数据,运行后关键列结果如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:30:14