首页 文章

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

提问于
浏览
6

假设我有一个 4x2 矩阵 .

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

这包含以下元素

1 5
2 6
3 7
4 8

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

在这里's something I came up with but it isn'做我想要的 . 我希望它返回包含 27 的矩阵中的行索引 .

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

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

3 回答

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

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

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

    希望有帮助:)

  • 8

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

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

相关问题