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
相关产品推荐
相关产品推荐

