Matrix - 选择除指定索引之外的所有内容

时间:2017-04-03 20:44:42

标签: r matrix

我知道您可以直接选择所需矩阵的索引:

mat <- matrix(1:6,ncol=3)
select <- matrix(c(1,2,1,2,3,3),ncol=2)
colnames(select) = c("row","col")

mat[select]
#[1] 3 6 5

R中是否有一种方法可以选择矩阵中除特定索引之外的所有元素?对于LETTERS[-1]的矢量,这很容易实现。理想情况下,我可以做mat[-select]之类的事情,但在尝试这个时,我得到:

mat[-select]
#Error in mat[-select] : 
#  negative values are not allowed in a matrix subscript

我尝试了什么:

library(dplyr)
all_ind <- expand.grid(row=1:nrow(mat),col=1:ncol(mat))
keep<-anti_join(all_ind,as.data.frame(select))

mat[as.matrix(keep)]
#[1] 4 2 1

这是有效的,但它需要一些强制和加入,这是不理想的。也许这只是我,但我似乎找不到任何简单的方法。

2 个答案:

答案 0 :(得分:3)

这是一种方式,仍然很复杂:

dplyr::anti_join(
  reshape2::melt(mat),
  as.data.frame(select),
  by=c(Var1 = "row", Var2 = "col")
)$value
# [1] 4 2 1

我正在使用reshape2:::melt.matrix,因为我猜这段经文此时没有模拟。

或者,将数学从矩阵(或数组)索引转换回矢量索引:

mat[ - (select[,"row"] + (select[,"col"]-1)*nrow(mat)) ]
# [1] 1 2 4

答案 1 :(得分:1)

setdiff(mat, mat[select])
#[1] 1 2 4
#Will most likely NOT WORK if there are duplicated values

也许一种解决方法是创建另一个矩阵(ind),其维度与mat相同,但索引为其值。然后使用与上面相同的方法

mat <- matrix(6:11,ncol=3) #NOTE this is different than in question
select <- matrix(c(1,2,1,2,3,3),ncol=2)
ind = matrix(1:length(mat), ncol = 3)
mat[setdiff(ind, ind[select])]
#[1] 6 7 9