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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:53:20