【问题标题】:Using 'which' with matrices in R - 'is.element()' condition在 R 中使用 'which' 和矩阵 - 'is.element()' 条件
【发布时间】:2019-01-22 10:28:41
【问题描述】:

如何在矩阵上使用which() 函数,使其返回条件为TRUE 的矩阵的坐标,条件使用%in% 运算符?

通常,我只使用which() 函数的arr.ind 参数。

mat <- matrix(nrow = 10, ncol = 10, data = 0)
mat[5,3] <- 7
which(mat==7, arr.ind = T)

这将返回 mat 中验证条件的每个元素的行和列。

但是,如果条件不是使用== 而是%in%,这似乎不起作用。

mat[4,7] <- 3
which(mat%in%c(3,7),arr.ind = T)

同样使用is.element:

which(is.element(mat,c(3,7)),T)

如何获取矩阵中验证%in% 条件的行和列?

【问题讨论】:

  • 真的sapply(c(3, 7), function(x) which(mat == x, arr.ind = TRUE))

标签: r logical-operators


【解决方案1】:

正如@akrun 在他的评论中提到的,您可以在一组输入上运行sapply() 进行检查。还有另一种方法可以帮助解释为什么%in% 的工作方式与== 不同:

当您使用== 检查单个值时,R 将返回一个矩阵对象,但是当您使用%in% 时,R 将返回一个逻辑值向量(TRUE 和 FALSE)

> class(mat == 3)
[1] "matrix"

> class(mat %in% 3)
[1] "logical"

所以arr.ind=T 的行为不同,因为它处理两种不同的数据类型。如果您希望使用与arr.ind=T 选项相同的形式但使用%in%,则可以使用原始矩阵中的行数和列数将逻辑向量转换回矩阵:

> which(matrix(mat%in%c(3,7), nrow=nrow(mat), ncol = ncol(mat)), arr.ind=TRUE)

     row col
[1,]   5   3
[2,]   4   7

这也与您的 == 示例保持相同的标签。

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多