如何用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
代码说明
- 筛选数据时保留完整的行信息,避免丢失时间与值的对应关系;
- 使用
format()函数将POSIX时间转换为%H:%M格式的字符串,确保和矩阵列名格式完全匹配; - 直接通过列名索引矩阵位置完成赋值,未匹配到的列自动保留初始的
NA。
内容的提问来源于stack exchange,提问作者Kj Ell
相关产品推荐
相关产品推荐

