我有一个矩阵A [72] [36],我想在一个更大的矩阵B [360] [180]中拟合A的值。
我构建了这个数据框,将A的col / row索引链接到新的'网格'。
> 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
问题在于我不知道如何创建新的360x180矩阵,对于每一对(LonNew,LatNew),我都有相应的NEWVar。
有人可以帮助我吗?
答案 0 :(得分:1)
我创建了一个更小,完整的可重复示例。这是较小的矩阵。
A<-matrix(1:4, nrow=2)
# [,1] [,2]
# [1,] 1 3
# [2,] 2 4
让我们假设您希望使用此索引将其扩展到5x5。
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)
)
将Lat和Lon的新值转换为数组索引的最简单方法是通过因子变量。所以我创造了
NNF <- factor(INDEX$LonNew)
TNF <- factor(INDEX$LatNew)
我用
创建新的B矩阵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
根据索引数据放大了矩阵。这里的诀窍就是用矩阵索引矩阵,这样我们每次都可以获取不同的行和列值。