【问题标题】:How to change 2D matrix back to 3D array in R如何在 R 中将 2D 矩阵更改回 3D 数组
【发布时间】: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)

【问题讨论】:

  • 感谢您添加数据,但使用当前代码,我们无法重新创建您的数据。根据您的描述,我建议将 latlon 更改为以下内容:lon &lt;- seq(from = 0, to = 360, by = 2.5)lat &lt;- seq(from = 20, to = 90, by = 2.5) - 我会为您这样做,但它与您当前的数据不符(即 lat 似乎从 17.5 开始,但您的描述说最低是 20)。
  • 感谢您的评论。抱歉,我是 R 编程的初学者。现在好些了吗?
  • 没问题!只是想帮忙。是的,这看起来很棒。我还建议添加生成 oldmatrix 的代码
  • 我认为问题出在modes &lt;- as.data.frame(svd.result$u)这行代码上。转换后,modes 不再是您最后一步所需的矩阵类型。如果您只需将其更改为 modes &lt;- svd.result$u,您的代码应该可以工作。
  • @ekoam 谢谢!它有帮助。如果需要,您可以添加答案。

标签: r dimensions


【解决方案1】:

问题出在modes &lt;- as.data.frame(svd.result$u)这行代码上。为了将结果转换回 3D 数组,您需要 modes 实际上是一个矩阵而不是数据框。如果您只需将其更改为 modes &lt;- svd.result$u,您的代码应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2017-09-23
    • 1970-01-01
    • 2016-12-11
    相关资源
    最近更新 更多