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

数据集子集均值计算、时间转年份及缺失均值前向填充实现方案

R语言分组时间区间统计+前向填充实现方案

1. 示例数据构造

先构造可直接运行的输入数据集:

DF <- data.frame(
  ID = c(1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3),
  time = c(0.1,0.5,2.1,3.3,0.3,0.4,0.6,1.2,1.5,2.6,2.7,0.1,0.4,1.3,1.5,1.6),
  value = c(3,5,6,12,1,3,5,4,8,2,14,1.1,2.3,6,3,6)
)

2. 推荐实现(tidyverse,逻辑清晰易维护)

直接对应需求的三步操作,代码可读性高:

library(dplyr)
library(tidyr)

step <- 1 # 可自定义时间步长,比如0.5、2

DF2 <- DF %>%
  # 转换time为对应year,步长可调整
  mutate(year = ceiling(time / step) * step) %>%
  # 按ID和year分组计算均值
  group_by(ID, year) %>%
  summarise(mean_value = mean(value), .groups = "drop") %>%
  # 补全每个ID从最小到最大年份的所有空缺行
  group_by(ID) %>%
  complete(year = full_seq(year, period = step)) %>%
  # 前向填充空缺年份的均值
  fill(mean_value, .direction = "down") %>%
  ungroup()

# 若需要和示例输出完全一致,可过滤掉首年无数据的行(按需选择)
DF2 <- DF2 %>% filter(!is.na(mean_value))

运行后结果和需求的期望输出完全匹配。

3. 基础R实现(适配apply使用需求)

解决你提到的apply传多参数、分组遍历时间区间的问题:

step <- 1 # 自定义步长参数

# 按ID拆分数据集,lapply遍历每个ID的子集,支持传入自定义参数
result_list <- lapply(split(DF, DF$ID), function(sub_df, step) {
  # 生成year字段
  sub_df$year <- ceiling(sub_df$time / step) * step
  # 按year计算均值
  year_mean <- aggregate(value ~ year, sub_df, mean)
  colnames(year_mean)[2] <- "mean_value"
  # 补全所有时间区间
  all_years <- seq(min(year_mean$year), max(year_mean$year), by = step)
  full_df <- data.frame(year = all_years)
  full_df <- merge(full_df, year_mean, by = "year", all.x = TRUE)
  # 前向填充NA
  full_df$mean_value <- zoo::na.locf(full_df$mean_value)
  # 加上ID字段
  full_df$ID <- unique(sub_df$ID)
  return(full_df[, c("ID", "year", "mean_value")])
}, step = step) # 这里传入自定义的step参数,解决多参数传递问题

# 合并所有ID的结果
DF2 <- do.call(rbind, result_list)
rownames(DF2) <- NULL

关键逻辑说明

  • 时间转年份规则:ceiling(time / step) * step天然满足左开右闭的区间映射,比如步长为1时,0<time≤1对应1,1<time≤2对应2,完全符合需求
  • 多参数传递:lapply的最后一个位置可以传入自定义参数,比如上面的step = step,如果需要自定义统计函数、填充规则等,都可以用同样的方式传入
  • 时间区间遍历:每个ID分组后,用seq生成从最小到最大年份的完整序列,自动覆盖所有长度为1的时间区间,不需要手动写循环遍历

内容的提问来源于stack exchange,提问作者hendrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:39:02