R中的子设置/匹配行和列
Sub-setting / Matching row and columns in R
好的,所以我需要一个非常具体的子集化公式。在矩阵 x 中,我只想保留由 rows 和 columns 定义的元素。然后应将不需要的元素替换为零。示例如下:
> 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
这种魔法叫做矩阵索引。如果你有 rows
和 cols
是你不想要的,或者如果矩阵索引允许负值,那就更容易了。
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
好的,所以我需要一个非常具体的子集化公式。在矩阵 x 中,我只想保留由 rows 和 columns 定义的元素。然后应将不需要的元素替换为零。示例如下:
> 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
这种魔法叫做矩阵索引。如果你有 rows
和 cols
是你不想要的,或者如果矩阵索引允许负值,那就更容易了。
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