如何在R中转换树木数据DataFrame,识别时段内被采伐的样地
样地时间区间采伐/死亡状态汇总(R语言实现)
需求分析
将单树木年度观测数据(df1)转换为样地维度的时间区间数据(df2):
- 每个样地的时间区间由该样地所有观测年份去重排序后,相邻年份组成
- 标记每个区间内样地是否存在采伐(或死亡,根据预期输出匹配调整)
代码实现
首先加载dplyr包进行数据处理:
# 安装并加载dplyr(若未安装) # install.packages("dplyr") library(dplyr)
步骤1:生成样地的时间区间
提取每个样地的唯一观测年份,排序后生成相邻年份的区间:
plot_intervals <- df1 %>% group_by(plot) %>% # 提取唯一年份并排序 summarise(year = sort(unique(year)), .groups = "drop") %>% group_by(plot) %>% # 生成区间结束年(下一个年份) mutate(year2 = lead(year)) %>% # 移除无结束年的行 filter(!is.na(year2)) %>% # 重命名起始年列 rename(year1 = year)
步骤2:匹配预期输出的状态标识(按树木死亡判断)
根据你提供的预期输出,实际逻辑是标记区间结束年份样地内是否有树木死亡(dead=1):
# 统计每个样地-年份的死亡状态 plot_dead_status <- df1 %>% group_by(plot, year) %>% # 只要有一棵树木死亡,标记为1 summarise(harvest = as.integer(any(dead == 1)), .groups = "drop") # 关联区间和死亡状态 df2 <- plot_intervals %>% left_join(plot_dead_status, by = c("plot", "year2" = "year")) %>% # 若该年份无死亡记录,标记为0 mutate(harvest = coalesce(harvest, 0L)) %>% select(plot, year1, year2, harvest) # 查看结果 df2
运行后得到的结果与你提供的df2完全一致。
步骤3:按采伐状态判断(符合需求描述)
如果严格按照需求描述,标记区间结束年份样地内是否有树木被采伐(harvest=1),代码调整为:
# 统计每个样地-年份的采伐状态 plot_harvest_status <- df1 %>% group_by(plot, year) %>% # 只要有一棵树木被采伐,标记为1 summarise(harvest = as.integer(any(harvest == 1)), .groups = "drop") # 关联区间和采伐状态 df2_harvest <- plot_intervals %>% left_join(plot_harvest_status, by = c("plot", "year2" = "year")) %>% mutate(harvest = coalesce(harvest, 0L)) %>% select(plot, year1, year2, harvest) # 查看结果 df2_harvest
此时样地B的第一个区间(2002-2004)harvest为0,因为该年份无采伐记录。
结果验证
按步骤2运行后,输出结果与你提供的预期df2完全匹配:
# 输出结果 > df2 # A tibble: 7 × 4 plot year1 year2 harvest <chr> <int> <int> <int> 1 A 2000 2005 0 2 A 2005 2010 1 3 B 2002 2004 1 4 B 2004 2006 1 5 C 2000 2005 0 6 C 2005 2010 0 7 C 2010 2015 1
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

