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

如何用which()筛选POSIX时间区间值并匹配填充至预定义矩阵(无数据填NA)

R语言:将筛选后的时间序列值匹配到预定义矩阵对应列

问题背景

现有如下R语言数据框:

dat <- data.frame("posix_time" = as.POSIXct(c("2021-07-01 01:00:00 CEST", "2021-07-01 01:10:00 CEST", "2021-07-01 01:20:00 CEST", 
                                   "2021-07-01 01:30:00 CEST", "2021-07-01 01:40:00 CEST", "2021-07-01 01:50:00 CEST",
                                   "2021-07-01 02:00:00 CEST", "2021-07-01 02:10:00 CEST", "2021-07-01 02:20:00 CEST")),
                  "value" = c(5, 8, 15, 7, 12, 5, 89, 1, 17))

已通过以下代码筛选出指定POSIX时间区间内的value值:

temp <- dat$value[which(dat$posix_time >= "2021-07-01 01:00:00" & dat$posix_time <= "2021-07-01 02:00:00")]

同时预定义了一个矩阵:

mat <- matrix(NA, ncol = 15, nrow = 1)
colnames(mat) <- c("00:00", "00:10", "00:20", "00:30", "00:40", "00:50", "01:00", "01:10", "01:20", "01:30", "01:40", "01:50", "02:00", "02:10", "02:20")

要求将筛选得到的value值匹配到矩阵对应时间列的位置,无对应数据的位置保留NA,最终矩阵样式如下:

00:00 00:10 00:20 00:30 00:40 00:50 01:00 01:10 01:20 01:30 01:40 01:50 02:00 02:10 02:20
NA    NA    NA    NA    NA    NA     5     8    15     7    12     5    89    NA    NA

实现方法

核心思路是保留筛选数据的时间信息,将其转换为与矩阵列名一致的时分格式字符串,通过名称匹配完成赋值操作。

完整代码

# 原始数据框
dat <- data.frame("posix_time" = as.POSIXct(c("2021-07-01 01:00:00 CEST", "2021-07-01 01:10:00 CEST", "2021-07-01 01:20:00 CEST", 
                                   "2021-07-01 01:30:00 CEST", "2021-07-01 01:40:00 CEST", "2021-07-01 01:50:00 CEST",
                                   "2021-07-01 02:00:00 CEST", "2021-07-01 02:10:00 CEST", "2021-07-01 02:20:00 CEST")),
                  "value" = c(5, 8, 15, 7, 12, 5, 89, 1, 17))

# 预定义矩阵
mat <- matrix(NA, ncol = 15, nrow = 1)
colnames(mat) <- c("00:00", "00:10", "00:20", "00:30", "00:40", "00:50", "01:00", "01:10", "01:20", "01:30", "01:40", "01:50", "02:00", "02:10", "02:20")

# 1. 筛选指定时间区间的行,保留时间和值的对应关系
filtered_dat <- dat[dat$posix_time >= "2021-07-01 01:00:00" & dat$posix_time <= "2021-07-01 02:00:00", ]

# 2. 将POSIX时间转换为矩阵列名一致的时分字符串
time_labels <- format(filtered_dat$posix_time, "%H:%M")

# 3. 通过列名匹配,将值赋值到矩阵对应位置
mat[1, time_labels] <- filtered_dat$value

# 查看最终结果
mat

代码说明

  1. 筛选数据时保留完整的行信息,避免丢失时间与值的对应关系;
  2. 使用format()函数将POSIX时间转换为%H:%M格式的字符串,确保和矩阵列名格式完全匹配;
  3. 直接通过列名索引矩阵位置完成赋值,未匹配到的列自动保留初始的NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:31:01