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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:45:05