如何筛选连续测量周期:永久样地多复测数据处理
筛选永久样地第二轮复测(t2)数据的解决方案
需求回顾
已通过以下代码筛选出永久样地的初始测量(t1)数据:
df_Time1 <- df %>% group_by(State, County, Plot) %>% slice(which.min(Cycle))
需要进一步筛选t2数据:即对应样地中,比t1的Cycle或Measured_year大一轮的复测记录。针对复测次数num_obs > 2且Measured_year与Cycle间隔不一致的样地,以下提供两种常见场景的实现方案。
数据示例
library(tibble) df <- tribble( ~State, ~County, ~Plot, ~Measured_year, ~basal_area, ~tph, ~Cycle, ~num_obs, 1, 1, 1, 2006, 10, 10, 8, 2, 2, 1, 2, 2002, 20, 20, 7, 3, 1, 1, 1, 2009, 30, 30, 9, 2, 2, 1, 1, 2005, 40, 40, 6, 3, 2, 1, 1, 2010, 50, 50, 8, 3, 2, 1, 2, 2013, 60, 60, 10, 2, 2, 1, 2, 2021, 70, 70, 12, 3, 2, 1, 1, 2019, 80, 80, 13, 3 )
方案1:取t1之后的第一次复测
适用于“大一轮”定义为紧随初始测量之后的首次复测,无需考虑间隔是否一致:
基于Cycle筛选
library(dplyr) df_Time2 <- df %>% group_by(State, County, Plot) %>% # 计算每个记录与t1的Cycle差值 mutate(cycle_diff = Cycle - min(Cycle)) %>% # 筛选差值最小且大于0的记录(即t1的下一轮) filter(cycle_diff == min(cycle_diff[cycle_diff > 0])) %>% ungroup()
基于Measured_year筛选
如果优先用年份判断:
df_Time2 <- df %>% group_by(State, County, Plot) %>% mutate(year_diff = Measured_year - min(Measured_year)) %>% filter(year_diff == min(year_diff[year_diff > 0])) %>% ungroup()
方案2:取与t1间隔等于第一轮间隔的复测
适用于“大一轮”定义为与初始测量的间隔等于t1到首次复测的间隔(即使后续复测间隔不一致,仍以第一轮间隔为标准):
基于Cycle间隔筛选
df_Time2 <- df %>% group_by(State, County, Plot) %>% # 获取t1的Cycle值,按Cycle排序后计算相邻间隔 mutate(t1_cycle = min(Cycle)) %>% arrange(Cycle) %>% mutate(cycle_interval = lead(Cycle) - Cycle) %>% # 计算目标Cycle:t1 + 第一轮间隔 mutate(target_cycle = t1_cycle + cycle_interval[Cycle == t1_cycle]) %>% # 匹配目标Cycle的记录 filter(Cycle == target_cycle) %>% ungroup() %>% # 清理临时计算列 select(-t1_cycle, -cycle_interval, -target_cycle)
基于Measured_year间隔筛选
如果优先用年份间隔判断:
df_Time2 <- df %>% group_by(State, County, Plot) %>% mutate(t1_year = min(Measured_year)) %>% arrange(Measured_year) %>% mutate(year_interval = lead(Measured_year) - Measured_year) %>% mutate(target_year = t1_year + year_interval[Measured_year == t1_year]) %>% filter(Measured_year == target_year) %>% ungroup() %>% select(-t1_year, -year_interval, -target_year)
自定义调整
如果“大一轮”是固定间隔(比如每5年/每2个Cycle一轮),可直接修改目标值的计算逻辑,例如:
# 固定Cycle间隔为2 df_Time2 <- df %>% group_by(State, County, Plot) %>% filter(Cycle == min(Cycle) + 2) %>% ungroup()
内容的提问来源于stack exchange,提问作者sakar299
相关产品推荐
相关产品推荐

