将R中的一个矩阵拟合到另一个矩阵中
我有一个矩阵a[72][36],我想在更大的矩阵B[360][180]中拟合a的值 我构建了这个数据框架,将A的列/行索引链接到新的“网格”将R中的一个矩阵拟合到另一个矩阵中,r,R,我有一个矩阵a[72][36],我想在更大的矩阵B[360][180]中拟合a的值 我构建了这个数据框架,将A的列/行索引链接到新的“网格” > head(INDEX) LonNew LatNew LonINT LatINT 1 -179.5 -89.5 1 1 2 -178.5 -88.5 1 1 3 -177.5 -87.5 1 1 4 -176.5 -86.5 1
> head(INDEX)
LonNew LatNew LonINT LatINT
1 -179.5 -89.5 1 1
2 -178.5 -88.5 1 1
3 -177.5 -87.5 1 1
4 -176.5 -86.5 1 1
5 -175.5 -85.5 1 1
6 -174.5 -84.5 2 2
7 -173.5 -83.5 2 2
8 -172.5 -82.5 2 2
9 -171.5 -81.5 2 2
10 -170.5 -80.5 2 2
然后我计算了新的Lat/Lon耦合的相应值
NEWVar <- array(NA, dim = length(INDEX$LonNew))
for (j in 1:length(INDEX$LonINT) ){
NEWVar[j] <- A[INDEX$LonINT[j],INDEX$LatINT[j]]
}
> head(NEWVar)
3 3 3 3 3 4 4 4 4 4
NEWVar我创建了一个更小、完全可复制的示例。这是较小的矩阵
A<-matrix(1:4, nrow=2)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
它根据索引数据放大了矩阵。这里的技巧就是用矩阵索引我们的矩阵,这样我们每次都可以获取不同的行和列值。欢迎使用堆栈溢出。请阅读并找出如何提出一个好的问题,从而产生好的、有用的答案。你能发布你的代码,以及预期的行为/结果和实际结果吗?我仍然对这个索引应该如何工作感到困惑。或者,当您使用NA创建NEWVar时,您是如何将值输入其中的。那三个和四个是从哪里来的?也许你不需要做一个完整的72x36矩阵,你可以创建一个小规模的问题。也许A是2x2,B是5x5,这样我们才能更好地了解你们在做什么?@Philip,第二个链接不起作用。@RichardScriven,请看编辑后的问题,许多感谢我不能使它适用于非二次矩阵,而且我不明白如何使用它来解决我的问题。我不确定二次型会有什么不同。您的数据与我的样本有何不同?索引表应该正在做所有的工作。好的,对不起,也许我不明白什么。你是如何创建LonInt和LatInt的?如果我这样做的话,INDEXI只是创建了一个示例索引映射。我想你会用你创造的。它应该在前两列中给出B的x,y值,在第二列中给出A的x,y索引值。您可以随意进行映射。但对于上面的示例,它更像是LonNew=rep(c(-2,-1,0,1,2),each=3),+LatNew=rep(c(-1,0,1),each=5)
,因此它们最终的长度相同。但是,我的方法不需要您更改INDEX data.frame。之后你要做什么,从因子转换开始。
INDEX<-data.frame(
LonNew = rep(c(-2,-2,0,2,2), each=5),
LatNew = rep(c(-2,-2,0,2,2), 5),
LonInt = rep(c(1,1,1,2,2), each=5),
LatInt = rep(c(1,1,2,1,2), 5)
)
NNF <- factor(INDEX$LonNew)
TNF <- factor(INDEX$LatNew)
B<-matrix(NA, nrow=nlevels(NNF), ncol=nlevels(TNF),
dimnames=list(levels(NNF), levels(TNF)))
B[cbind(NNF, TNF)] <- A[cbind(INDEX$LonInt, INDEX$LatInt)]
# -2 0 2
# -2 1 3 3
# 0 1 3 3
# 2 2 4 4