我知道您可以直接选择所需矩阵的索引:
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
这是有效的,但它需要一些强制和加入,这是不理想的。也许这只是我,但我似乎找不到任何简单的方法。
答案 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