R中的子设置/匹配行和列

Sub-setting / Matching row and columns in R

好的,所以我需要一个非常具体的子集化公式。在矩阵 x 中,我只想保留由 rowscolumns 定义的元素。然后应将不需要的元素替换为零。示例如下:

> x <- matrix(c(65,46,52,76,34,345,65,87,12,53),nrow = 5,ncol = 2)
> x
     [,1] [,2]
[1,]   65  345
[2,]   46   65
[3,]   52   87
[4,]   76   12
[5,]   34   53

> rows <- c(1,1,2,3,3,4,5)
> cols <- c(1,2,2,1,2,1,2)

魔法

> x
     [,1] [,2]
[1,]   65  345
[2,]    0   65
[3,]   52   87
[4,]   76    0
[5,]    0   53

非常感谢

这是一个可能的解决方案,不一定漂亮或高效。遍历每个单元格,如果它不在您的原始坐标集中,则将其设置为 0。

x <- matrix(c(65,46,52,76,34,345,65,87,12,53),nrow = 5,ncol = 2)
rows <- c(1,1,2,3,3,4,5)
cols <- c(1,2,2,1,2,1,2)
coords <- paste(rows,cols)
numRows <- 5
numCols <- 2
for (i in 1:numRows){
  for (j in 1:numCols){
    if (!(paste(i,j) %in% coords)){
      x[i,j] <- 0
    }
  }
}

巴洛克风格:

    indicies <- NULL
    for (iter in 1:length(rows)) {
      indicies <- rbind(indicies, c(rows[iter], cols[iter]))
    }

    indicies
     [,1] [,2]
[1,]    1    1
[2,]    1    2
[3,]    2    2
[4,]    3    1
[5,]    3    2
[6,]    4    1
[7,]    5    2

    y <- matrix(rep(0, 10), nrow=5, ncol=2)
    for (k in 1:nrow(indicies)) {
      y[indicies[k,1], indicies[k,2]] <- x[indicies[k,1], indicies[k,2]]
    }
    y
         [,1] [,2]
    [1,]   65  345
    [2,]    0   65
    [3,]   52   87
    [4,]   76    0
    [5,]    0   53

这种魔法叫做矩阵索引。如果你有 rowscols 是你不想要的,或者如果矩阵索引允许负值,那就更容易了。

y <- matrix(0, nrow=5, ncol=2)
y[cbind(rows,cols)] <- x[cbind(rows,cols)]
y
##      [,1] [,2]
## [1,]   65  345
## [2,]    0   65
## [3,]   52   87
## [4,]   76    0
## [5,]    0   53

或者,您可以做同样的事情 "by hand," 并且能够使用负下标,只要知道矩阵可以被视为一个向量,索引沿列向下。

k <- (cols-1)*nrow(x) + rows
x[-k] <- 0
x
##      [,1] [,2]
## [1,]   65  345
## [2,]    0   65
## [3,]   52   87
## [4,]   76    0
## [5,]    0   53