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

如何在R中按ID_Plot与Old_ID关联合并Excel内多年树木调查工作表

R实现方案

依赖包安装与加载

需要先安装并加载以下工具包:

  • readxl:用于读取Excel工作簿数据
  • tidyverse:用于数据关联、清洗与格式转换
install.packages(c("readxl", "tidyverse"))
library(readxl)
library(tidyverse)

步骤1:批量读取所有工作表数据

首先读取工作簿内的6个目标工作表,同时为每条数据增加对应的调查年份标识:

# 替换为你的Excel文件实际存储路径
file_path <- "树木调查数据.xlsx"
# 筛选出符合命名规则的树木调查工作表
sheet_names <- excel_sheets(file_path) %>% 
  str_subset("^Trees_\\d{4}$")
# 批量读取所有工作表,合并为初始长表
raw_data <- map_dfr(sheet_names, function(sheet) {
  year <- str_extract(sheet, "\\d{4}") %>% as.numeric()
  read_excel(file_path, sheet = sheet) %>% 
    mutate(year = year, .before = everything())
})

步骤2:生成同株树的全局唯一ID映射

按调查年份从早到晚排序,在同一样地范围内关联新旧树木ID,生成每株树的唯一标识符:

# 按年份升序排列数据,优先处理最早的调查记录
sorted_data <- raw_data %>% arrange(year)
# 提取所有调查年份的升序列表
year_list <- sort(unique(sorted_data$year))
# 初始化ID映射:最早年份的树木直接用「样地ID_树木当年编号」作为唯一ID
id_mapping <- sorted_data %>% 
  filter(year == year_list[1]) %>% 
  mutate(unique_tree_id = paste0(ID_Plot, "_", ID_tree)) %>% 
  select(ID_Plot, year, ID_tree, unique_tree_id)
# 迭代关联后续年份的树木ID,补全映射表
for (i in 2:length(year_list)) {
  current_year <- year_list[i]
  prev_year <- year_list[i-1]
  current_year_data <- sorted_data %>% filter(year == current_year)
  # 关联上一次调查的映射表,通过Old_ID匹配上一年的树木编号
  current_mapped <- current_year_data %>% 
    left_join(
      id_mapping %>% filter(year == prev_year) %>% select(ID_Plot, ID_tree, unique_tree_id),
      by = c("ID_Plot" = "ID_Plot", "Old_ID" = "ID_tree")
    ) %>% 
    # 当年首次调查的无Old_ID树木,直接生成新的唯一ID
    mutate(unique_tree_id = ifelse(is.na(unique_tree_id), paste0(ID_Plot, "_", ID_tree), unique_tree_id)) %>% 
    select(ID_Plot, year, ID_tree, unique_tree_id)
  # 将当前年份的映射关系合并到总映射表
  id_mapping <- bind_rows(id_mapping, current_mapped)
}

步骤3:生成最终合并宽表

将唯一ID映射回原始数据,转换为按年列示胸径数据的目标格式:

final_result <- raw_data %>% 
  left_join(id_mapping, by = c("ID_Plot", "year", "ID_tree")) %>% 
  select(unique_tree_id, ID_Plot, year, DBH_mm) %>% 
  pivot_wider(
    names_from = year,
    values_from = DBH_mm,
    names_prefix = "DBH_"
  )

结果说明

输出的final_result即为所需合并表,每行对应一株唯一树木,各年份的DBH数据对应单独列,无对应调查数据的年份单元格为NA值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:45:07