假设我有一个4x2
矩阵。
x<- matrix(seq(1:8), 4)
包含以下元素
1 5
2 6
3 7
4 8
对于这个特定示例,假设我要删除包含“2”或“7”的行(无需手动查看矩阵并删除它们)。我该怎么做?
这是我想出的东西,但它并没有按照我的意愿去做。我希望它返回矩阵中包含 a2
或 a的行索引7
。
remove<- which(2 || 7 %in% x)
x<- x[-remove,]
谁能帮我解决这个问题?
x[-which(x == 2 | x == 7, arr.ind = TRUE)[,1],]
是我能想到的最简单、最有效的方法。
单“|” 检查每个元素是 2 还是 7('||' 不会这样做)。arr.ind 将每个位置作为一对坐标给出,而不是默认的单个数字。[,1] 选择具有 2 或 7 的每一行。
希望有帮助:)
正如@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]