如何在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周)
最终要得到如下格式的结果表格:
| Species | Days | Weeks |
|---|---|---|
| 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
相关产品推荐
相关产品推荐

