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

如何在R中统计鸟类物种的唯一观测天数与出现周数

R语言统计鸟类观测数据的唯一天数与周数

问题背景

我有一个包含129952行记录的鸟类观测tibble数据集,核心字段包括COMMON NAME(物种俗名)、OBSERVATION DATE(观测日期,格式为dttm)。数据示例如下:

# A tibble: 129,952 × 6
   `TAXONOMIC ORDER` `COMMON NAME`    `SCIENTIFIC NAME` `OBSERVATION COUNT` `OBSERVATION DATE`   ...6
               <dbl> <chr>            <chr>             <chr>               <dttm>              <dbl>
 1             10444 Accipiter sp.    Accipiter sp.     1                   2018-01-21 00:00:00    NA
 2             27278 Accipiter sp.    Accipiter sp.     1                   2019-10-19 00:00:00    NA
 3             22631 Accipiter sp.    Accipiter sp.     1                   2019-10-19 00:00:00    NA
 4             21017 Accipiter sp.    Accipiter sp.     1                   2020-12-13 00:00:00    NA
 5              1498 Accipiter sp.    Accipiter sp.     1                   2020-12-13 00:00:00    NA
 6              1871 Accipiter sp.    Accipiter sp.     1                   2021-01-31 00:00:00    NA
 7              1871 Accipiter sp.    Accipiter sp.     1                   2021-01-31 00:00:00    NA
 8              5468 Accipiter sp.    Accipiter sp.     1                   2021-02-14 00:00:00    NA
 9             30260 Accipiter sp.    Accipiter sp.     1                   2022-10-12 00:00:00    NA
10             10393 Acrocephalus sp. Acrocephalus sp.  1                   2019-09-17 00:00:00    NA
# ℹ 129,942 more rows
# ℹ Use `print(n = ...)` to see more rows

我需要按物种统计两个核心指标:

  • 该物种的唯一观测天数(同一日期多次观测只算1天)
  • 该物种出现的唯一周数(同一周内的观测只算1周)

最终要得到如下格式的结果表格:

SpeciesDaysWeeks
Alexandrine Parakeet----
Acrocephalus sp.----

之前尝试过COUNT函数(因版本兼容问题无法在新版R运行)和nrow函数,但没找到正确用法;Excel可以实现但效率极低,求R中的高效解决方案。


解决方案

用tidyverse工具集(dplyr做分组统计,lubridate处理日期)可以高效完成这个需求,步骤如下:

1. 加载必要的包

library(tidyverse)
library(lubridate)

2. 执行统计计算

将代码中的your_data替换为你的数据集名称:

bird_summary <- your_data %>%
  # 按物种俗名分组
  group_by(`COMMON NAME`) %>%
  # 计算唯一天数和周数
  summarise(
    Days = n_distinct(date(`OBSERVATION DATE`)),  # 提取纯日期并统计唯一值数量
    Weeks = n_distinct(isoweek(`OBSERVATION DATE`)),  # 提取ISO周数并统计唯一值数量
    .groups = "drop"  # 统计后取消分组状态
  ) %>%
  # 重命名列名匹配需求格式
  rename(Species = `COMMON NAME`)

代码说明

  • n_distinct():专门用于统计唯一值的数量,比手动去重再用nrow计数更简洁高效,完美替代失效的COUNT函数
  • date():从dttm类型的日期中提取纯日期部分(去掉时分秒),避免同一日期不同时间被误判为不同天数
  • isoweek():将日期转换为ISO标准的周数(每年的周数从1到53),确保同一周内的所有观测只算1周
  • .groups = "drop":分组统计后取消分组,避免后续操作受到分组状态的干扰

3. 查看结果

运行以下代码即可看到符合需求的统计表格:

print(bird_summary)

示例输出:

# A tibble: X × 3
  Species               Days Weeks
  <chr>                <int> <int>
1 Accipiter sp.            6     6
2 Acrocephalus sp.         1     1
3 Alexandrine Parakeet    ...   ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:10:42