在R Studio中的特定位置将元素插入到可变大小矩阵中

时间:2016-07-30 21:00:48

标签: r matrix

我有一个名为sectorCoor的矩阵,其中包含18个lat长坐标的列表。这18个坐标依赖于另一个变量,它可以将矩阵的大小从最小值6改变到最大值36.矩阵将始终是6的倍数。因此,根据扇区的大小我想要矩阵将现有矩阵划分为大小为6的元素,然后从那里我想将变量siteCoor添加到sectorCoor矩阵的最开头,再次在前6个元素之后,添加siteCoor并取下6个,依此类推,直到所有6的倍数都已完成。

非常感谢您的建议。

 siteCoor, 
 first 6 lon lat coordinates
 siteCoor
 siteCoor
 Next 6 lon lat coordinates
 siteCoor
 siteCoor
 Next 6 lon lat coordinates
 siteCoor

> siteCoor
         [,1]     [,2]
[1,] 152.7075 -27.7027

> sectorCoor
           lon       lat
 [1,] 152.7075 -27.70270
 [2,] 152.6983 -27.68203
 [3,] 152.7028 -27.68085
 [4,] 152.7075 -27.68046
 [5,] 152.7122 -27.68085
 [6,] 152.7167 -27.68203
 [7,] 152.7209 -27.68394
 [8,] 152.7322 -27.70592
 [9,] 152.7311 -27.71000
[10,] 152.7291 -27.71382
[11,] 152.7264 -27.71724
[12,] 152.7230 -27.72015
[13,] 152.7190 -27.72243
[14,] 152.6920 -27.72015
[15,] 152.6886 -27.71724
[16,] 152.6858 -27.71382
[17,] 152.6839 -27.71000
[18,] 152.6828 -27.70592
[19,] 152.6825 -27.70173

1 个答案:

答案 0 :(得分:1)

我会预先分配正确大小的矩阵,并单独填充siteCoorsectorCoor行。我们可以使用传递给matrix()的初始数据向量来填充siteCoor行,然后使用索引分配来填充sectorCoor行。

res <- matrix(siteCoor,nrow(sectorCoor)+nrow(sectorCoor)%/%6L*2L,2L,byrow=T);
res[c(F,rep(T,6L),F),] <- sectorCoor;
res;
##       [,1] [,2]
##  [1,]   -1   -2
##  [2,]    1   19
##  [3,]    2   20
##  [4,]    3   21
##  [5,]    4   22
##  [6,]    5   23
##  [7,]    6   24
##  [8,]   -1   -2
##  [9,]   -1   -2
## [10,]    7   25
## [11,]    8   26
## [12,]    9   27
## [13,]   10   28
## [14,]   11   29
## [15,]   12   30
## [16,]   -1   -2
## [17,]   -1   -2
## [18,]   13   31
## [19,]   14   32
## [20,]   15   33
## [21,]   16   34
## [22,]   17   35
## [23,]   18   36
## [24,]   -1   -2

在上面我使用一个简短的逻辑向量来下标sectorCoor resres。 R在N <- 3L; sectorCoor <- matrix(seq_len(N*6L*2L),ncol=2L); siteCoor <- matrix(c(-1,-2),ncol=2L); 的整个行大小上循环使用向量,从而实现存储模式所需的周期性。

数据

myApp.factory('geoLocationService', function () {
    return {
        getMyGeolocation: function() {
            return new Promise((resolve, reject) => {
                var options = {
                    enableHighAccuracy: true,
                    timeout: 5000,
                    maximumAge: 0 };

                navigator.geolocation.getCurrentPosition(
                    pos => resolve(pos.coords), 
                    err => reject(err),
                    options
                );
            };
        },
    };
});