在R语言中为小时变量创建虚拟矩阵用于线性回归的求助
问题描述
我的数据集跨度为一年,最初是15分钟粒度,已聚合为小时粒度,共8760个小时(每天包含0至23点)。我希望为线性回归创建一个24行24列的虚拟变量矩阵,格式如下:
| hour 1 | hour 2 | ... |
|---|---|---|
| 1 | 0 | |
| 0 | 1 |
我尝试了多种函数但均未成功,希望能得到帮助。以下是当前数据集的处理代码:
data$time = substr(data$x, 1, 16) data$time <- as.POSIXct(data$start_time, format = "%d.%m.%Y %H:%M", tz = "UTC") data = subset(data, select = -c(x, y)) data$hour <- hour(data$time) head(data) df = data %>% mutate(data_aggregate = floor_date(time, unit = "hour")) %>% group_by(data_aggregate) %>% summarise(W = sum(W, na.rm = TRUE)) df1 <- df %>% mutate(hour = as.factor(hour(data_aggregate)))
解决方案
这里提供几种简单直接的方法生成你需要的虚拟变量矩阵:
方法1:用model.matrix(适配线性回归场景)
model.matrix是R中生成虚拟变量的标准工具,直接基于你的df1数据生成:
# 生成虚拟变量矩阵,-1用于移除截距项,避免多重共线性 hour_dummies <- model.matrix(~ hour - 1, data = df1) # 提取唯一的24行24列模板(因为全年数据每个小时重复365次) unique_hour_dummies <- unique(hour_dummies)
unique_hour_dummies就是你要的目标矩阵,列名对应hour0到hour23,每行对应一个小时,对应位置值为1,其余为0。
方法2:手动构建矩阵(直观可控)
如果想自定义列名和结构,可以直接生成单位矩阵并调整:
# 生成0-23小时的向量 hours <- 0:23 # 构建24x24的单位矩阵,转置后调整列名匹配你的示例 hour_dummies <- t(diag(24)) colnames(hour_dummies) <- paste0("hour_", hours + 1) rownames(hour_dummies) <- hours
这个矩阵完全符合你给出的格式,每行对应一个小时,对应列设为1,其余为0。
方法3:用tidyverse工具链生成
如果习惯使用dplyr和tidyr,可以用pivot_wider实现:
library(tidyverse) # 创建包含所有小时的基础数据框 hour_df <- tibble(hour = factor(0:23)) # 生成虚拟变量 hour_dummies <- hour_df %>% mutate(value = 1) %>% pivot_wider(names_from = hour, values_from = value, values_fill = 0) # 调整列名(可选,匹配你示例中的hour1到hour24) colnames(hour_dummies) <- paste0("hour_", as.integer(colnames(hour_dummies)) + 1)
内容的提问来源于stack exchange,提问作者momo
相关产品推荐
相关产品推荐

