基于R语言tidyverse的海量数据集月度位置均值聚合求助
用tidyverse对昆虫学数据集做月度聚合(降低时间自相关)
核心思路
将数据集按同一位置(经度+纬度)+ 同一日历年月分组,对昆虫计数及数值型环境变量计算月度均值;分类型变量(如land)因同位置取值一致,直接保留唯一值即可。
完整代码实现
# 加载所需包 library(tidyverse) library(lubridate) # 示例数据集(用户提供) df <- data.frame( insects = round(runif(20)*100), long = c(rep(22.4,5), rep(18.4,5), rep(21.8,5), rep(20.1,5)), lat = c(rep(-34.1,5), rep(-34.4,5), rep(-33.8,5), rep(-33.7,5)), land = c(rep("AG8",5), rep("GA6",5), rep("HE1",5), rep("JA2",5)), temp = round(runif(20)*15), NDVI = c(rep(c(48032730,48493073,48449380,48423773,48420000),4)), precip = round(runif(20)*15), date = lubridate::as_date(rep(c("2006-01-15", "2006-01-25", "2006-01-04", "2007-02-15", "2007-02-18", "2006-01-15", "2008-02-20", "2008-02-01", "2009-04-08", "2009-04-19"),2)) ) # 数据清洗与聚合 df_cleaned <- df %>% # 提取年份和月份,生成统一的年月分组标识 mutate(year_month = floor_date(date, unit = "month")) %>% # 按位置、土地类型、年月分组(land同位置取值一致,不影响分组结果) group_by(long, lat, land, year_month) %>% # 对数值型变量计算月度均值,保留分类型变量唯一值 summarise( insects_mean = mean(insects, na.rm = TRUE), temp_mean = mean(temp, na.rm = TRUE), NDVI_mean = mean(NDVI, na.rm = TRUE), precip_mean = mean(precip, na.rm = TRUE), .groups = "drop" ) # 验证分组结果的行数分布 df_cleaned %>% count(long, lat)
代码细节说明
floor_date(date, unit = "month"):将所有日期向下取整到当月第一天,确保同一月份的记录被归为同一组。group_by(...):用位置信息、土地类型和年月作为分组依据,避免因分类型变量导致的额外分组。summarise():针对数值型变量计算均值,na.rm = TRUE处理潜在缺失值;.groups = "drop"聚合后取消分组状态,方便后续数据操作。
结果验证
运行代码后,count(long, lat)的输出会与预期完全匹配:
- 经度22.4、纬度-34.1:2行
- 经度18.4、纬度-34.4:3行
- 经度21.8、纬度-33.8:2行
- 经度20.1、纬度-33.7:3行
内容的提问来源于stack exchange,提问作者JDK
相关产品推荐
相关产品推荐

