简体   繁体   中英

Replacing elemnts of an R matrix using a location matrix in R

In the following example i am trying to replace some elements of a two columns matrix m using a two column matrix containing row and columns positions.

bbb

 [,1] [,2] [1,] 21 1 [2,] 15 2 [3,] 16 2 [4,] 17 2 [5,] 18 2 [6,] 19 2 [7,] 20 2 [8,] 21 2 [9,] 22 2 [10,] 23 2 [11,] 24 2 [12,] 25 2 [13,] 26 2 [14,] 27 2 [15,] 13 3 m = matrix(nrow=30,ncol=4) > m[as.matrix(bbb)] = matrix(1:15,ncol=1) > sum(.is,na(m)) [1] 15 > > m[:1,3] [,1] [,2] [,3] [1,] NA NA NA [2,] NA NA NA [3,] NA NA NA [4,] NA NA NA [5,] NA NA NA [6,] NA NA NA [7,] NA NA NA [8,] NA NA NA [9,] NA NA NA [10,] NA NA NA [11,] NA NA NA [12,] NA NA NA [13,] NA 15 NA [14,] NA NA NA [15,] NA 2 NA [16,] NA 3 NA [17,] NA 4 NA [18,] NA 5 NA [19,] NA 6 NA [20,] NA 7 NA [21,] 1 8 NA [22,] NA 9 NA [23,] NA 10 NA [24,] NA 11 NA [25,] NA 12 NA [26,] NA 13 NA [27,] NA 14 NA [28,] NA NA NA [29,] NA NA NA [30,] NA NA NA

The last element that should be modified is at position (13,3), but instead, the modification is done at position (12,2) which does not appear in the positions matrix bbb. Any help?

The behavior is even weirder in the following example..

> bbb
    [,1] [,2]
21    21    1
56    15    2
57    16    2
58    17    2
59    18    2
60    19    2
61    20    2
62    21    2
63    22    2
64    23    2
65    24    2
66    25    2
67    26    2
68    27    2
95    13    3
96    14    3
97    15    3
98    16    3
99    17    3
100   18    3
> m = matrix(nrow=30,ncol=4)
> m[as.matrix(bbb)] = 1:20
> sum(!is.na(m))
[1] 16
> 
> m
      [,1] [,2] [,3] [,4]
 [1,]   NA   NA   NA   NA
 [2,]   NA   NA   NA   NA
 [3,]   NA   NA   NA   NA
 [4,]   NA   NA   NA   NA
 [5,]   NA   NA   NA   NA
 [6,]   NA   NA   NA   NA
 [7,]   NA   NA   NA   NA
 [8,]   NA   NA   NA   NA
 [9,]   NA   NA   NA   NA
[10,]   NA   NA   NA   NA
[11,]   NA   NA   NA   NA
[12,]   NA   NA   NA   NA
[13,]   NA   15   NA   NA
[14,]   NA   16   NA   NA
[15,]   NA   17   NA   NA
[16,]   NA   18   NA   NA
[17,]   NA   19   NA   NA
[18,]   NA   20   NA   NA
[19,]   NA    6   NA   NA
[20,]   NA    7   NA   NA
[21,]    1    8   NA   NA
[22,]   NA    9   NA   NA
[23,]   NA   10   NA   NA
[24,]   NA   11   NA   NA
[25,]   NA   12   NA   NA
[26,]   NA   13   NA   NA
[27,]   NA   14   NA   NA
[28,]   NA   NA   NA   NA
[29,]   NA   NA   NA   NA
[30,]   NA   NA   NA   NA

We need to use a vector

m[as.matrix(bbb)] <- 1:15

-output

> m
      [,1] [,2] [,3] [,4]
 [1,]   NA   NA   NA   NA
 [2,]   NA   NA   NA   NA
 [3,]   NA   NA   NA   NA
 [4,]   NA   NA   NA   NA
 [5,]   NA   NA   NA   NA
 [6,]   NA   NA   NA   NA
 [7,]   NA   NA   NA   NA
 [8,]   NA   NA   NA   NA
 [9,]   NA   NA   NA   NA
[10,]   NA   NA   NA   NA
[11,]   NA   NA   NA   NA
[12,]   NA   NA   NA   NA
[13,]   NA   NA   15   NA
[14,]   NA   NA   NA   NA
[15,]   NA    2   NA   NA
[16,]   NA    3   NA   NA
[17,]   NA    4   NA   NA
[18,]   NA    5   NA   NA
[19,]   NA    6   NA   NA
[20,]   NA    7   NA   NA
[21,]    1    8   NA   NA
[22,]   NA    9   NA   NA
[23,]   NA   10   NA   NA
[24,]   NA   11   NA   NA
[25,]   NA   12   NA   NA
[26,]   NA   13   NA   NA
[27,]   NA   14   NA   NA
[28,]   NA   NA   NA   NA
[29,]   NA   NA   NA   NA
[30,]   NA   NA   NA   NA

-second example

m2 <- matrix(nrow=30,ncol=4)
m2[as.matrix(bbb2)] = 1:20

output

> m2
      [,1] [,2] [,3] [,4]
 [1,]   NA   NA   NA   NA
 [2,]   NA   NA   NA   NA
 [3,]   NA   NA   NA   NA
 [4,]   NA   NA   NA   NA
 [5,]   NA   NA   NA   NA
 [6,]   NA   NA   NA   NA
 [7,]   NA   NA   NA   NA
 [8,]   NA   NA   NA   NA
 [9,]   NA   NA   NA   NA
[10,]   NA   NA   NA   NA
[11,]   NA   NA   NA   NA
[12,]   NA   NA   NA   NA
[13,]   NA   NA   15   NA
[14,]   NA   NA   16   NA
[15,]   NA    2   17   NA
[16,]   NA    3   18   NA
[17,]   NA    4   19   NA
[18,]   NA    5   20   NA
[19,]   NA    6   NA   NA
[20,]   NA    7   NA   NA
[21,]    1    8   NA   NA
[22,]   NA    9   NA   NA
[23,]   NA   10   NA   NA
[24,]   NA   11   NA   NA
[25,]   NA   12   NA   NA
[26,]   NA   13   NA   NA
[27,]   NA   14   NA   NA
[28,]   NA   NA   NA   NA
[29,]   NA   NA   NA   NA
[30,]   NA   NA   NA   NA

data

bbb <- structure(c(21, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 
27, 13, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3), .Dim = c(15L, 
2L))
m <- matrix(nrow=30,ncol=4)
bbb2 <- structure(c(21L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
24L, 25L, 26L, 27L, 13L, 14L, 15L, 16L, 17L, 18L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L), .Dim = c(20L, 2L), .Dimnames = list(c("21", "56", "57", 
"58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", 
"95", "96", "97", "98", "99", "100"), NULL))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM