R使用ave函数计算times类时间分组均值报FUN未找到错误如何解决
问题根源
ave()函数的FUN参数要求传入可调用的函数对象,你原写法直接将计算表达式赋值给FUN,相当于先执行表达式得到计算结果,再把非函数的结果传给FUN参数,自然会触发「找不到函数类型的FUN对象」的报错。
修复方案
方案1:原生逻辑包装为匿名函数(复用你原有计算逻辑)
多分组场景下同时用到slt和wup两个变量,用dplyr的分组改写更直观,不会出现变量匹配错误:
library(dplyr) library(chron) mon <- mon %>% group_by(code, tmp, wek) %>% mutate(sbd = { offset_slt <- ifelse(slt <= wup, slt + 1, slt) mean_val <- mean(offset_slt) # 均值超过1的部分减去1天,转回标准times格式 times(ifelse(mean_val >= 1, mean_val - 1, mean_val)) }) %>% ungroup()
如果坚持要用ave实现,需要把行索引传入,写法如下:
library(chron) mon$sbd <- ave(seq(nrow(mon)), mon$code, mon$tmp, mon$wek, FUN = function(idx) { offset_slt <- ifelse(mon$slt[idx] <= mon$wup[idx], mon$slt[idx] + 1, mon$slt[idx]) mean_val <- mean(offset_slt) times(ifelse(mean_val >= 1, mean_val - 1, mean_val)) })
方案2:使用环形时间均值函数(无需手动写偏移逻辑)
就寝时间属于24小时周期的环形数据,可以直接用circular包的环形均值函数,自动处理跨零点场景:
library(dplyr) library(chron) library(circular) mon <- mon %>% group_by(code, tmp, wek) %>% mutate(sbd = { # 转成0-24小时的环形时间格式 slt_cir <- circular(as.numeric(slt)*24, units = "hours", template = "clock24") # 计算环形均值后转回times格式 times(as.numeric(mean(slt_cir))/24) }) %>% ungroup()
内容的提问来源于stack exchange,提问作者psycho95
相关产品推荐
相关产品推荐

