【发布时间】:2021-12-29 21:18:19
【问题描述】:
我有一个 3D 数组,其中包含 lon(1:144)(范围 0-360,步长为 2.5)、lat(1:29)(20-90,步长为 2.5)和一个时间变量(1 :180)(30 年,包括每年 6 个月)。
lon <- seq(from = 0, to = 360, by = 2.5)
lat <- seq(from = 17.5, to = 90, by = 2.5)
time <- c(1:180)
var <- c(28532:31298)
我通过乘以 lon*lat 将数据转换为 2D 矩阵:
new2Ddata <- matrix(oldmatrix, prod(dim(oldmatrix)[1:2]), dim(oldmatrix)[3])
然后我计算了svd:
svd.result <- svd(new2Ddata)
我得到了包含三个组件的 svd.result 并使用组件 U [1:4176 (lon*lat), 1:180 (variable)] 制作了一个新的数据框
modes <- as.data.frame(svd.result$u)
我必须再次将其转换为 3D(经度、纬度、时间和时间变量)。我试过了:
dim(modes) <- c(144,29,180)
我收到一个错误:dim(modes)
【问题讨论】:
-
感谢您添加数据,但使用当前代码,我们无法重新创建您的数据。根据您的描述,我建议将
lat和lon更改为以下内容:lon <- seq(from = 0, to = 360, by = 2.5)和lat <- seq(from = 20, to = 90, by = 2.5)- 我会为您这样做,但它与您当前的数据不符(即lat似乎从 17.5 开始,但您的描述说最低是 20)。 -
感谢您的评论。抱歉,我是 R 编程的初学者。现在好些了吗?
-
没问题!只是想帮忙。是的,这看起来很棒。我还建议添加生成
oldmatrix的代码 -
我认为问题出在
modes <- as.data.frame(svd.result$u)这行代码上。转换后,modes不再是您最后一步所需的矩阵类型。如果您只需将其更改为modes <- svd.result$u,您的代码应该可以工作。 -
@ekoam 谢谢!它有帮助。如果需要,您可以添加答案。
标签: r dimensions