You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:15:03