如何将R中含x、y、date、value列的数据框转为适配SOM的每日矩阵
问题解决方法
首先明确需求:将包含x、y、date、value四列的长表,转换为每行对应1个日期、每列对应1个(x,y)点位数值的矩阵,适配kohonen包som函数的输入要求。
原代码报错核心原因
- 按(x,y)分组做标准化时,部分点位只有1条观测记录,
scale计算会返回NA - 长宽转换后矩阵存在缺失值,som函数不允许输入包含NA的数值矩阵
修正后完整代码
首先加载依赖包:
library(dplyr) library(tidyr) library(kohonen)
数据转换代码:
# 1. 补全所有日期和(x,y)点位的组合,用同点位均值填充缺失值,也可根据需求替换为插值等填充方法 dtt_full <- dtt %>% complete(date, nesting(x, y), fill = list(value = NA)) %>% group_by(x, y) %>% mutate(value = ifelse(is.na(value), mean(value, na.rm = T), value)) %>% ungroup() # 2. 数值标准化,可根据分析需求调整为按点位分组标准化 dtt_full$value <- scale(dtt_full$value) # 3. 长宽转换生成符合要求的矩阵 dtt_mat <- dtt_full %>% unite("xy", x, y, sep = "_") %>% pivot_wider(names_from = xy, values_from = value) %>% select(-date) %>% as.matrix() # 验证矩阵无缺失值,返回0即符合要求 sum(is.na(dtt_mat))
运行som函数:
som_res <- som( X = dtt_mat, grid = somgrid(xdim = 2, ydim = 2, topo = "rectangular"), keep.data = TRUE ) # 输出分析结果 print(som_res)
可选调整说明
- 如果数据中存在大量缺失点位,可以先过滤掉有效观测数少于指定阈值的(x,y)点位再做转换
- 标准化方式可根据分析场景调整,只要保证最终矩阵无缺失值即可
内容的提问来源于stack exchange,提问作者Lily Nature
相关产品推荐
相关产品推荐

