R语言如何为split生成的tibble列表批量计算周度温度统计值
解决方案
最优方案:无需拆分数据框,直接分组统计
直接对原始数据框同时按plotid和周度分组,一步完成所有地块的统计,完全不需要拆分列表:
library(tidyverse) library(lubridate) # floor_date函数需要依赖该包 all_weekly_stat <- dfall1 %>% group_by(plotid, Week = floor_date(time1-4, unit="week")) %>% summarize( weeklyAvsoilT=mean(pinTemp,na.rm=T), weeklyminsoilT=min(pinTemp,na.rm=T), weeklymaxsoilT=max(pinTemp,na.rm=T), weeklyAvsurfT=mean(surfaceTemp,na.rm=T), weeklyminsurfT=min(surfaceTemp,na.rm=T), weeklymaxsurfT=max(surfaceTemp,na.rm=T), weeklyAvairT=mean(airTemp,na.rm=T), weeklyminairT=min(airTemp,na.rm=T), weeklymaxairT=max(airTemp,na.rm=T), min_date = min(time1), max_date = max(time1) ) %>% mutate( min_weekday = weekdays(min_date), max_weekday = weekdays(max_date) )
运行后直接得到包含所有27个plotid周度统计结果的完整tibble,无需后续合并。
如果你需要保留拆分列表的处理逻辑
方案1:基础R lapply 实现
将统计逻辑封装为匿名函数传入lapply,批量处理列表内每个子tibble:
# 批量计算每个子tibble的周度统计 stat_list <- lapply(names(new), function(pid) { new[[pid]] %>% group_by(Week = floor_date(time1-4, unit="week")) %>% summarize( weeklyAvsoilT=mean(pinTemp,na.rm=T), weeklyminsoilT=min(pinTemp,na.rm=T), weeklymaxsoilT=max(pinTemp,na.rm=T), weeklyAvsurfT=mean(surfaceTemp,na.rm=T), weeklyminsurfT=min(surfaceTemp,na.rm=T), weeklymaxsurfT=max(surfaceTemp,na.rm=T), weeklyAvairT=mean(airTemp,na.rm=T), weeklyminairT=min(airTemp,na.rm=T), weeklymaxairT=max(airTemp,na.rm=T), min_date = min(time1), max_date = max(time1) ) %>% mutate( plotid = pid, # 加入plotid标识对应原始分组 min_weekday = weekdays(min_date), max_weekday = weekdays(max_date) ) }) # 可选操作:把所有子结果合并为一个大tibble all_stat <- do.call(rbind, stat_list)
方案2:tidyverse生态 purrr::imap 实现
语法更简洁,自动获取列表元素名作为plotid:
library(purrr) stat_list <- imap(new, function(df, pid) { df %>% group_by(Week = floor_date(time1-4, unit="week")) %>% summarize( weeklyAvsoilT=mean(pinTemp,na.rm=T), weeklyminsoilT=min(pinTemp,na.rm=T), weeklymaxsoilT=max(pinTemp,na.rm=T), weeklyAvsurfT=mean(surfaceTemp,na.rm=T), weeklyminsurfT=min(surfaceTemp,na.rm=T), weeklymaxsurfT=max(surfaceTemp,na.rm=T), weeklyAvairT=mean(airTemp,na.rm=T), weeklyminairT=min(airTemp,na.rm=T), weeklymaxairT=max(airTemp,na.rm=T), min_date = min(time1), max_date = max(time1) ) %>% mutate( plotid = pid, min_weekday = weekdays(min_date), max_weekday = weekdays(max_date) ) }) # 可选操作:合并为全量tibble all_stat <- list_rbind(stat_list)
内容的提问来源于stack exchange,提问作者Matonga
相关产品推荐
相关产品推荐

