在R中如何按站点与调查周期从样方数据生成平均值数据集?
问题描述
我有一个3000多行的数据集,列标题包括:Survey_Date、Year、Quarter、Site_Name、Quadrat、Species以及若干数据值列。数据来自5个站点的物种样带调查,每个站点设12个永久样方,过去12年每季度开展一次测量,每12行对应一次调查。
我需要为每个站点的每次调查生成一个仅含一行均值记录的data frame/tibble,汇总12个样方的平均值。目前用手动逐个筛选季度的方式处理,效率极低,希望找到更简便的方法。
数据示例(前24行):
CL.SGN.Data <- structure(list(Species = c("Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. marina", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica", "Z. japonica"), Survey_Date = structure(c(1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400, 1350518400), tzone = "UTC", class = c("POSIXct", "POSIXt")), Year = c("2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2012"), Quarter = c("4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4", "4"), Site_Name = c("Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay", "Birch Bay"), Quad = c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12"), Cover = c(0.75, 0.75, 0.45, 0.65, 0.1, 0.05, 0.1, 0.05, 0.05, 0.01, 0.02, 0.01, 0, 0, 0.05, 0.05, 0, 0, 0, 0, 0, 0, 0, 0), Calculated_Density = c(65, 60, 26, 20, 3.75, 9, 9, 16, 8, 5, 5, 2, 0, 0, NA, NA, 0, 0, 0, 0, 0, 0, 0, 0), Average_Height = c(46.6666666666667, 39.9, 42, 53.5, 41.6666666666667, 40, 48.8333333333333, 54.6666666666667, 66, 30.5, 47.5, 50, 0, 0, NA, NA, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -24L), class = c("tbl_df", "tbl", "data.frame"))
之前尝试的低效代码示例:
library(tidyverse) BB_ZM_2013_Q1 <- CL.SGN.DATA %>% filter(str_detect(Site_Name, "Birch Bay"), str_detect(Species, "Z. marina"), str_detect(Year, "2013"), str_detect(Quarter, "1")) %>% mutate(Mean.Cover = mean(Cover), Mean.Height = mean(Average_Height), Mean.Density = mean(Calculated_Density)) %>% select(Species, Year, Quarter, Site_Name, Mean.Cover, Mean.Height, Mean.Density) %>% slice_head() BB_ZM_2013_Q2 <- CL.SGN.DATA %>% filter(str_detect(Site_Name, "Birch Bay"), str_detect(Species, "Z. marina"), str_detect(Year, "2013"), str_detect(Quarter, "2")) %>% mutate(Mean.Cover = mean(Cover), Mean.Height = mean(Average_Height), Mean.Density = mean(Calculated_Density)) %>% select(Species, Year, Quarter, Site_Name, Mean.Cover, Mean.Height, Mean.Density) %>% slice_head()
解决方案
使用dplyr的分组汇总功能,一行代码即可完成所有站点、所有调查的均值计算,无需手动逐个处理:
library(tidyverse) # 按站点、物种、年份、季度、调查日期分组,计算各指标的均值 summary_data <- CL.SGN.Data %>% group_by(Site_Name, Species, Year, Quarter, Survey_Date) %>% summarise( Mean.Cover = mean(Cover, na.rm = TRUE), Mean.Density = mean(Calculated_Density, na.rm = TRUE), Mean.Height = mean(Average_Height, na.rm = TRUE), .groups = "drop" # 取消分组状态 ) # 如果需要按站点拆分单独的data frame,可以用nest或者split # 按站点拆分得到列表,每个元素是对应站点的汇总数据 site_summary_list <- summary_data %>% group_by(Site_Name) %>% nest() # 提取单个站点的数据,比如Birch Bay BB_summary <- site_summary_list %>% filter(Site_Name == "Birch Bay") %>% pull(data) %>% pluck(1)
代码说明
group_by():指定分组依据,确保每组对应一次调查的12个样方,覆盖所有站点、物种、年份和季度的组合。summarise():对每个分组计算核心指标的均值,na.rm = TRUE用于忽略数据中的NA值,避免计算出错。.groups = "drop":完成汇总后取消分组,返回普通的tibble格式,方便后续处理。- 拆分站点数据:如果需要单独提取某个站点的汇总结果,用
nest()和pull()即可快速实现,无需手动创建多个变量。
这样处理后,summary_data包含所有站点、所有调查的均值记录,每条记录对应一次调查的汇总结果;如果需要单独站点的数据,从site_summary_list中提取即可,完全替代手动逐个筛选的低效操作。
内容的提问来源于stack exchange,提问作者Shanafelt_Ben
相关产品推荐
相关产品推荐

