如何在R中将20分钟间隔的时序温度数据转为宽格式矩阵?
用R语言将时序温度数据转换为日期-时刻矩阵
问题背景
拥有2019年时序温度数据集,包含date(日期)、time(时刻)、tmpc(温度)三列,数据为每日20分钟间隔的观测值,示例数据如下:
date time tmpc 1. 2019-01-01 00:15 3.11 2. 2019-01-01 00:35 3.22 3. 2019-01-01 00:55 3.28 4. 2019-01-01 01:15 3.28 5. 2019-01-01 01:35 3.28 6. 2019-01-01 01:55 3.28
需要将其转换为**行对应日期(共365行)、列对应时刻(共72列)**的矩阵,温度值需准确匹配对应日期与时刻。当前尝试创建矩阵时,行名显示为数字而非预期的日期,且不清楚如何填充数据。
尝试的代码:
a = matrix (data= NA, nrow = 365, ncol = 72) colnames(a) = c("00:15", "00:35", "00:55", "01:15", "01:35", "01:55", "02:15", "02:35", "02:55", "03:15", "03:35", "03:55", "04:15", "04:35", "04:55", "05:15", "05:35", "05:55", "06:15", "06:35", "06:55", "07:15", "07:35", "07:55", "08:15", "08:35", "08:55", "09:15", "09:35", "09:55", "10:15", "10:35", "10:55", "11:15", "11:35", "11:55", "12:15", "12:35", "12:55", "13:15", "13:35", "13:55", "14:15", "14:35", "14:55", "15:15", "15:35", "15:55", "16:15", "16:35", "16:55", "17:15", "17:35", "17:55", "18:15", "18:35", "18:55", "19:15", "19:35", "19:55", "20:15", "20:35", "20:55", "21:15", "21:35", "21:55", "22:15", "22:35", "22:55", "23:15", "23:35", "23:55") rownames(a) = c(seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day"))
解决方案
1. 解决行名显示为数字的问题
原代码中seq.Date()生成的是Date类型对象,直接赋值给矩阵行名时,R会自动将其转换为内部存储的数值(从1970-01-01开始的天数)。只需将Date对象转为字符型即可:
rownames(a) = as.character(seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day"))
2. 填充矩阵数据(基础R方法)
假设原始数据存储在名为df的数据框中,通过循环匹配日期和时刻,将温度值填入对应位置:
# 确保原始数据的date为Date类型,time为字符型 df$date <- as.Date(df$date) df$time <- as.character(df$time) # 遍历每一行数据,填充矩阵 for(i in 1:nrow(df)){ # 找到对应日期的行索引 row_idx <- which(rownames(a) == as.character(df$date[i])) # 找到对应时刻的列索引 col_idx <- which(colnames(a) == df$time[i]) # 赋值温度值 a[row_idx, col_idx] <- df$tmpc[i] }
3. 更高效的方法(使用tidyr包)
借助tidyverse生态中的tidyr::pivot_wider函数,可以更简洁地完成宽表转换,同时自动补全所有日期:
library(tidyverse) # 预处理数据类型 df <- df %>% mutate(date = as.Date(date), time = as.character(time)) # 生成2019年所有日期 full_dates <- tibble(date = seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day")) # 转换为宽表并补全所有日期 wide_temp <- full_dates %>% left_join(df, by = "date") %>% pivot_wider(names_from = time, values_from = tmpc) %>% column_to_rownames(var = "date") # 转换为矩阵 temp_matrix <- as.matrix(wide_temp)
此方法无需手动创建空矩阵,直接从原始数据转换得到目标矩阵,缺失的观测值会自动填充为NA。
内容的提问来源于stack exchange,提问作者sehne
相关产品推荐
相关产品推荐

