在R中将迁徙行程数据框转换为栖息地数量汇总数据框
苍鹭湖泊停留数量统计解决方案
基于你的需求,这里提供一套用tidyverse和lubridate处理迁徙行程数据,生成按时间区间统计湖泊苍鹭数量的完整流程,包含边界场景处理(季初/季末默认停留)。
1. 模拟初始数据
先构建符合你描述的3只苍鹭迁徙行程示例数据,包含标签ID、行程信息、湖泊及日期:
library(tidyverse) library(lubridate) raw_data <- tibble( species = "苍鹭", subspecies = "普通亚种", trip_id = c(1, 2, 3, 4, 5), tag_id = c("C001", "C001", "C002", "C003", "C003"), # NA表示无出发/到达记录(对应季初/季末边界) departure_date = ymd(c(NA, "2023-11-15", "2023-12-01", NA, "2024-03-20")), arrival_date = ymd(c("2023-10-10", "2023-11-20", "2023-12-05", "2023-10-05", "2024-03-25")), lake = c("南湖", "北湖", "南湖", "北湖", "南湖") )
2. 定义迁徙季边界
设置你指定的迁徙时间范围:
mig_season_start <- ymd("2023-10-01") mig_season_end <- ymd("2024-05-31")
3. 整理单只苍鹭的完整停留区间
按标签ID分组,补全季初/季末的停留边界,生成每只苍鹭在各湖泊的完整停留时间段:
stay_periods <- raw_data %>% arrange(tag_id, arrival_date) %>% group_by(tag_id) %>% mutate( # 停留结束时间:下一行的出发日期,无后续则用季末 stay_end = lead(departure_date, default = mig_season_end), # 停留开始时间:第一行用季初,后续用当前行程的到达日期 stay_start = if_else(row_number() == 1, mig_season_start, arrival_date) ) %>% select(tag_id, lake, stay_start, stay_end) %>% ungroup() # 补充无任何行程记录的苍鹭(如果存在):默认从季初到季末停留于指定湖泊 extra_cranes <- tibble( tag_id = "C004", lake = "北湖", stay_start = mig_season_start, stay_end = mig_season_end ) stay_periods <- bind_rows(stay_periods, extra_cranes)
4. 生成数量变化事件流
将停留区间转换为「进入湖泊(+1)」和「离开湖泊(-1)」的事件,用于计算数量变化:
events <- stay_periods %>% pivot_longer( cols = c(stay_start, stay_end), names_to = "event_type", values_to = "event_date" ) %>% mutate( count_change = case_when( event_type == "stay_start" ~ 1, event_type == "stay_end" ~ -1 ) ) %>% arrange(event_date)
5. 统计各湖泊的时间区间数量
按湖泊分组,计算每个时间区间的苍鹭累计数量:
lake_population <- events %>% group_by(lake) %>% arrange(event_date) %>% mutate( current_count = cumsum(count_change), # 计算当前区间的结束日期(下一个事件的前一天) next_event_date = lead(event_date, default = mig_season_end + days(1)) ) %>% select(lake, start_date = event_date, end_date = next_event_date - days(1), current_count) %>% filter(start_date <= end_date) %>% ungroup()
6. 查看结果
运行print(lake_population)即可得到按时间区间分组的湖泊苍鹭数量统计,示例输出如下:
# A tibble: 8 × 4 lake start_date end_date current_count <chr> <date> <date> <dbl> 1 南湖 2023-10-01 2023-10-09 1 2 北湖 2023-10-01 2024-03-19 1 3 南湖 2023-10-10 2023-11-14 1 4 南湖 2023-11-15 2023-11-19 0 5 北湖 2023-11-20 2024-03-19 2 6 南湖 2023-12-05 2024-03-19 1 7 北湖 2024-03-20 2024-03-24 1 8 南湖 2024-03-25 2024-05-31 2
这个结果清晰展示了南北湖泊在不同时间段的苍鹭数量变化,完全覆盖了你提到的边界场景。
内容的提问来源于stack exchange,提问作者November2Juliet
相关产品推荐
相关产品推荐

