在R语言中是否有一种函数可以查找包含特定元素的矩阵行?

6

假设我有一个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,]

有人能帮我弄清楚这个问题吗?


4
which()是正确的函数,但您需要再多了解一下索引语法。 - Dirk Eddelbuettel
3
which返回无匹配项的情况下,x[-which(...), ]是危险的。建议使用x[!(...), ] - flodel
3个回答

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

这是我能想到的最简单、最有效的方法。
单个符号 '|' 检查每个元素是否为2或7('||'无法完成)。arr.ind会将每个位置给出为一对坐标,而不是默认的单个数字。[,]1选择具有2或7的每行。
希望这可以帮助 :)

谢谢@RyanGrannell。顺便说一句,你在19岁时就已经掌握了很好的R技能。你是在哪里学习R编程的? - user1313954
1
谢谢,我很高兴我的回答有帮助。回答你的问题,我是利用业余时间,使用R文档、Twitter和当然是Stack Exchange学习的 :) - Róisín Grannell

3

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

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

他不想要“x[-index,]”吗? - Simon O'Hanlon
起初他想要删除它们,然后他想让它返回矩阵中包含2或7的行索引。 - liuminzhao

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接