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

R语言:Random Forest前置时间序列数据集预处理求助

时间序列数据集预处理方案(适配Random Forest模型)

针对年尺度半小时时间序列数据集(约200个变量、17000条观测),以下是解决三个预处理问题的可执行R代码方案:


核心需求与对应方案

  • 用对应日期的每日均值填充NA值
  • 批量删除字符列,保留日期型列
  • 高效批量计算各列每日均值,避免手动处理

准备工作:加载依赖包

# 首次运行需安装包
install.packages(c("dplyr", "lubridate"))

# 加载数据处理与日期工具包
library(dplyr)
library(lubridate)

步骤1:统一日期格式并批量移除字符列

先将日期列转换为标准POSIXct格式,再筛选保留日期列与数值列,自动剔除所有字符型列:

处理示例数据

# 示例数据集
TIMESTAMP <- c("2019-04-27 17:30:00", "2019-04-27 18:00:00", "2019-04-27 18:30:00", "2019-04-27 19:00:00", "2019-04-27 19:30:00", "2019-04-28 10:00:00", "2019-04-28 10:30:00", "2019-04-28 11:00:00", "2019-04-28 11:30:00", "2019-04-28 12:00:00")
dates<-c("2019-04-27", "2019-04-27", "2019-04-27", "2019-04-27", "2019-04-27", "2019-04-28", "2019-04-28", "2019-04-28", "2019-04-28", "2019-04-28")
ch4_flux <- c(NA, 66.39, 65.39, 64.41, 63.52, 62.76, 62.16,NA, 61.54,61.53)
distance <- c(1000,1000,NA,125.35,1000,NA,1000,5.50,NA,1000)
Tau <-c(0.0322000, 0.0495000, 0.1737616, 0.1772567, NA, 0.1246816, 0.1435230, 0.1098670, NA, NA)
filename<- c("2019-04-27T173000_AIU-2079.ghg","2019-04-27T180000_AIU-2079.ghg", "2019-04-27T183000_AIU-2079.ghg","2019-04-27T190000_AIU-2079.ghg", "2019-04-27T193000_AIU-2079.ghg",NA,  "2019-04-28T100000_AIU-2079.ghg","2019-04-28T103000_AIU-2079.ghg", "2019-04-28T110000_AIU-2079.ghg",NA)

dd<- data.frame(TIMESTAMP, dates, ch4_flux, distance,Tau, filename)

# 转换日期格式+筛选保留日期/数值列
dd_clean <- dd %>%
  mutate(
    TIMESTAMP = ymd_hms(TIMESTAMP),
    dates = ymd(dates)
  ) %>%
  select(where(~inherits(.x, c("POSIXct", "numeric"))))

处理原始数据集(AMPdates2)

直接对原始数据集执行以下代码:

AMPdates2_clean <- AMPdates2 %>%
  mutate(
    TIMESTAMP = ymd_hms(TIMESTAMP),
    date = ymd(date)
  ) %>%
  select(where(~inherits(.x, c("POSIXct", "numeric"))))

步骤2:批量计算各列每日均值

按日期分组,批量计算所有数值列的每日均值:

# 示例数据计算每日均值
daily_means <- dd_clean %>%
  group_by(dates) %>%
  summarise(across(where(is.numeric), ~mean(.x, na.rm = TRUE)), .groups = "drop")

# 原始数据集计算每日均值
daily_means_AMP <- AMPdates2_clean %>%
  group_by(date) %>%
  summarise(across(where(is.numeric), ~mean(.x, na.rm = TRUE)), .groups = "drop")

步骤3:用每日均值填充NA值

将原始数据与每日均值表关联,批量替换NA值:

# 填充示例数据的NA
dd_filled <- dd_clean %>%
  left_join(daily_means, by = "dates", suffix = c("", "_mean")) %>%
  mutate(across(where(is.numeric), ~ifelse(is.na(.x), get(paste0(cur_column(), "_mean")), .x))) %>%
  select(-ends_with("_mean"))

# 填充原始数据集的NA
AMPdates2_filled <- AMPdates2_clean %>%
  left_join(daily_means_AMP, by = "date", suffix = c("", "_mean")) %>%
  mutate(across(where(is.numeric), ~ifelse(is.na(.x), get(paste0(cur_column(), "_mean")), .x))) %>%
  select(-ends_with("_mean"))

完整整合代码(示例数据)

# 加载包
library(dplyr)
library(lubridate)

# 示例数据集
TIMESTAMP <- c("2019-04-27 17:30:00", "2019-04-27 18:00:00", "2019-04-27 18:30:00", "2019-04-27 19:00:00", "2019-04-27 19:30:00", "2019-04-28 10:00:00", "2019-04-28 10:30:00", "2019-04-28 11:00:00", "2019-04-28 11:30:00", "2019-04-28 12:00:00")
dates<-c("2019-04-27", "2019-04-27", "2019-04-27", "2019-04-27", "2019-04-27", "2019-04-28", "2019-04-28", "2019-04-28", "2019-04-28", "2019-04-28")
ch4_flux <- c(NA, 66.39, 65.39, 64.41, 63.52, 62.76, 62.16,NA, 61.54,61.53)
distance <- c(1000,1000,NA,125.35,1000,NA,1000,5.50,NA,1000)
Tau <-c(0.0322000, 0.0495000, 0.1737616, 0.1772567, NA, 0.1246816, 0.1435230, 0.1098670, NA, NA)
filename<- c("2019-04-27T173000_AIU-2079.ghg","2019-04-27T180000_AIU-2079.ghg", "2019-04-27T183000_AIU-2079.ghg","2019-04-27T190000_AIU-2079.ghg", "2019-04-27T193000_AIU-2079.ghg",NA,  "2019-04-28T100000_AIU-2079.ghg","2019-04-28T103000_AIU-2079.ghg", "2019-04-28T110000_AIU-2079.ghg",NA)

dd<- data.frame(TIMESTAMP, dates, ch4_flux, distance,Tau, filename)

# 1. 清洗数据
dd_clean <- dd %>%
  mutate(
    TIMESTAMP = ymd_hms(TIMESTAMP),
    dates = ymd(dates)
  ) %>%
  select(where(~inherits(.x, c("POSIXct", "numeric"))))

# 2. 计算每日均值
daily_means <- dd_clean %>%
  group_by(dates) %>%
  summarise(across(where(is.numeric), ~mean(.x, na.rm = TRUE)), .groups = "drop")

# 3. 填充NA值
dd_filled <- dd_clean %>%
  left_join(daily_means, by = "dates", suffix = c("", "_mean")) %>%
  mutate(across(where(is.numeric), ~ifelse(is.na(.x), get(paste0(cur_column(), "_mean")), .x))) %>%
  select(-ends_with("_mean"))

# 查看处理结果
head(dd_filled)

关键说明

  • 使用dplyr::across()实现批量操作,高效适配200+变量的大数据集
  • lubridate包确保日期格式统一,避免分组计算时出现错误
  • 填充逻辑仅针对数值列,日期列全程保留,不参与均值计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:00:53