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

在R中如何基于data.table按地点和物种聚合截面积并生成指定矩阵

森林调查数据转换:从data.table到物种-地点汇总矩阵

需求说明

我有一份存储大规模森林调查结果的大型.csv文件,每行记录单棵树木的调查地点(site)、物种(sp)和实测截面积(area)。通过fread()将文件读入RStudio得到data.table对象,需要将其转换为矩阵:

  • 矩阵每行对应一个调查地点
  • 每列对应一个物种
  • 单元格值为该物种在对应地点的所有树木截面积之和

模拟输入数据

> raw.input <- fread("raw_input.csv")
> raw.input
      site  sp x-sect area
1: hilltop sp2          10
2: hilltop sp1           3
3: hilltop sp1           5
4: hilltop sp1           4
5: hilltop sp1           3
6:  stream sp3          45
7:  stream sp3          50
8:  stream sp1           4

期望输出矩阵

> mtrx.tmp <- fread("mtrx_final.csv")
> mtrx <- as.matrix(mtrx.tmp[,2:4]) # 移除字符列,保留数值矩阵
> row.names(mtrx) <- mtrx.tmp$site  # 设置行名为调查地点
> mtrx
        sp1 sp2 sp3
hilltop  15  10   0
stream    4   0  95

解决方案

利用data.table的分组聚合和重塑功能,高效完成转换:

# 1. 按地点和物种分组,计算截面积总和
sum_dt <- raw.input[, .(total_area = sum(area)), by = .(site, sp)]

# 2. 将长格式数据转为宽格式,缺失的物种-地点组合填充0
wide_dt <- dcast(sum_dt, site ~ sp, value.var = "total_area", fill = 0)

# 3. 转换为矩阵并设置行名
mtrx <- as.matrix(wide_dt[, -1])  # 移除site列
row.names(mtrx) <- wide_dt$site

执行上述代码后,得到的mtrx与期望输出完全一致。

关于data.table的适用性

data.table是处理这类大型数据集的最优选择之一:

  • fread()读取大型CSV的速度远快于base R的read.csv()或readr::read_csv(),内存占用也更高效
  • 分组聚合(by = .(site, sp))和宽格式转换(dcast())都经过底层优化,在百万级甚至更大规模的数据集上,性能远超dplyr等工具
  • 语法简洁,适合批量处理和重复分析任务

内容的提问来源于stack exchange,提问作者fre1990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:54:12