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

在R语言中为小时变量创建虚拟矩阵用于线性回归的求助

问题描述

我的数据集跨度为一年,最初是15分钟粒度,已聚合为小时粒度,共8760个小时(每天包含0至23点)。我希望为线性回归创建一个24行24列的虚拟变量矩阵,格式如下:

hour 1hour 2...
10
01

我尝试了多种函数但均未成功,希望能得到帮助。以下是当前数据集的处理代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:37:18