group_by仅返回单行结果,aggregate得预期值的EddyData处理问题
解决dplyr group_by返回单行的问题
看起来你的问题出在DoY列的计算方式或者潜在的类型/时区问题上,导致group_by没有正确识别分组。咱们一步步来解决:
1. 先排查DoY列的实际内容
首先,先确认你的DoY列是不是真的包含多个不同的分组值:
df %>% pull(DoY) %>% unique()
如果这里只返回一个值,那group_by自然只会输出一行——这说明你的DoY计算逻辑有问题。
2. 用更可靠的方式计算DoY
你当前用as.POSIXlt(date.time - 15*60)$yday的方式容易受时区、POSIXlt对象的隐性行为影响。推荐用lubridate包的函数来处理日期,更直观且不易出错:
library(tidyverse) library(lubridate) # 重新生成数据并计算DoY date.time <- seq(from=as.POSIXct("2015-01-01 00:30:00"), to=as.POSIXct("2015-01-03 00:30:00"),by="30 mins") nee <- runif(length(date.time),-200,200) df <- data.frame(date.time, nee) %>% mutate( # 调整时间(减15分钟),确保午夜属于前一天 adjusted_time = date.time - minutes(15), # 计算0-based的年日(和你原本的逻辑一致) DoY = yday(adjusted_time) - 1 )
3. 重新执行分组汇总
现在再跑你的group_by+summarise:
aggDay <- df %>% group_by(DoY) %>% summarise(nee = sum(nee)) aggDay
这时候应该会返回和aggregate一样的多行结果。
4. 额外排查点
如果还是有问题,检查这两个地方:
- dplyr版本:旧版本的dplyr可能存在分组相关的bug,运行
packageVersion("dplyr")查看版本,低于1.0.0的话建议更新:install.packages("dplyr") - 时区一致性:确保你的
date.time列和所有日期计算都用同一个时区(比如UTC),避免跨时区导致的日期偏移:df <- df %>% mutate(date.time = force_tz(date.time, tzone = "UTC"))
适配你的原始代码
把这个可靠的DoY计算逻辑替换到你的原始代码里,就能继续用dplyr的链式语法完成后续计算了:
aggDay <- df %>% group_by(DoY) %>% summarise( DateTime = first(DateTime), nRec = sum(NEE_uStar_fqc == 0, na.rm = TRUE), nEff = computeEffectiveNumObs(resid, effAcf = !!autoCorr, na.rm = TRUE), NEE = mean(NEE_uStar_f, na.rm = TRUE), sdNEE = if (nEff <= 1) NA_real_ else sqrt(mean(NEE_uStar_fsd^2, na.rm = TRUE) / (nEff - 1)), sdNEEuncorr = if (nRec == 0) NA_real_ else sqrt(mean(NEE_uStar_fsd^2, na.rm = TRUE) / (nRec - 1)) )
内容的提问来源于stack exchange,提问作者Felix Phl
相关产品推荐
相关产品推荐

