假设我有一个4x2
矩阵。
x<- matrix(seq(1:8), 4)
这包含以下元素:
1 5
2 6
3 7
4 8
针对这个特定的例子,假设我想要删除包含'2'或'7'的行(而不必手动查找矩阵并将它们删除)。我该怎么做?
这是我想出来的一些东西,但它没有达到我的预期。我希望它返回包含2
或7
的矩阵行索引。
remove<- which(2 || 7 %in% x)
x<- x[-remove,]
有人能帮我弄清楚这个问题吗?
x[-which(x == 2 | x == 7, arr.ind = TRUE)[,1],]
正如 @Dirk 所说,which
是正确的函数,这是我的答案:
index <- apply(x, 1, function(a) 2 %in% a || 7 %in% a)
> index
[1] FALSE TRUE TRUE FALSE
x[index, ]
x[-which(...), ]
不是正确的方法... 为什么?看看如果 which
找不到匹配项会发生什么:
x <- matrix(8, nrow = 4, ncol = 2)
x[-which(x == 2 | x == 7, arr.ind = TRUE)[,1],]
# [,1] [,2]
对于这种情况,它不返回任何内容,但应该返回整个x
。
相反,使用逻辑索引是更安全的方法:您可以取反匹配向量而不会冒像上面显示的奇怪行为的风险。以下是一个示例:
x[!(rowSums(x == 2 | x == 7) > 0), , drop = FALSE]
这也可以用更短的形式来写:
x[!rowSums(x == 2 | x == 7), , drop = FALSE]
which()
是正确的函数,但您需要再多了解一下索引语法。 - Dirk Eddelbuettelwhich
返回无匹配项的情况下,x[-which(...), ]
是危险的。建议使用x[!(...), ]
。 - flodel