是否有R函数用于查找包含矩阵中特定元素的行?

时间:2012-11-10 20:15:41

标签: r matrix rows which

假设我有一个4x2矩阵。

x<- matrix(seq(1:8), 4)

包含以下元素

1 5
2 6
3 7
4 8

对于这个具体的例子,假设我想删除包含'2'或'7'的行(无需手动查看矩阵并删除它们)。我该怎么做?

这是我想出来的东西,但它并没有按照我的意愿行事。我希望它返回矩阵中包含27的行索引。

remove<- which(2 || 7 %in% x)
x<- x[-remove,]

任何人都可以帮我解决这个问题吗?感谢

3 个答案:

答案 0 :(得分:8)

x[-which(x == 2 | x == 7, arr.ind = TRUE)[,1],] 

是我能想到的最简单,最有效的方式。

单曲'|'检查每个元素是2还是7('||'不会这样做)。 arr.ind将每个位置作为一对坐标,而不是默认的单个数字。 [,1]选择每行有2或7的行。

希望有所帮助:)

答案 1 :(得分:3)

正如@Dirk所说,which是正确的功能,这是我的回答:

index <- apply(x, 1, function(a) 2 %in% a || 7 %in% a)
> index
[1] FALSE  TRUE  TRUE FALSE
x[index, ]

答案 2 :(得分:3)

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]