R:有条件删除矩阵中的行和列

标签 r matrix conditional-statements

我有一个共现类型数据的方阵,例如:

m <- matrix(c(30, 30, 30, 30, 20, 0, 0,
    30, 373, 30, 204, 207, 0, 290,
    30, 30, 65, 65, 20, 35, 0,
    30, 204, 65, 239, 38, 35, 156,
    20, 207, 20, 38, 207, 0, 134,
    0, 0, 35, 35, 0, 35, 0,
    0, 290, 0, 156, 134, 0, 290),
    nrow=7, byrow=TRUE)

通过比较上三角+对角线元素,有一些非对角线等于对角线。我想通过满足以下条件来删除行和列:

if ((m[i,j] == m[i,i]) & (m[i,j] < m[j,j])) 

这样,只留下出现次数较多的行/列,而当某个元素总是与另一个元素同时出现时,则取出该行/列。

输出应该是:

373  204
204  239

谢谢!

最佳答案

这是一种矢量化方法:

i <- as.vector(row(m))
j <- as.vector(col(m))
k <- matrix(m == m[cbind(i, i)] & m < m[cbind(j, j)], nrow(m))

#       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
# [1,] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
# [2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [3,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
# [4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
# [6,] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
# [7,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

delete.idx <- sort(unique(i[k]))
# [1] 1 3 5 6 7

keep.idx <- setdiff(seq_len(nrow(m)), delete.idx)
# [1] 2 4

m[keep.idx, keep.idx]
#      [,1] [,2]
# [1,]  373  204
# [2,]  204  239

关于R:有条件删除矩阵中的行和列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17771598/

相关文章:

r - 如何从 R 关闭 pdf 文件

python - 具有指定误报和灵敏度的随机森林

python - numpy 矩阵排名不正确的结果

Mysql 多表查询带条件

r - 为什么 expand.grid 忽略选项?

python - 如何将特定链接存储为列表然后单击它们

R将矩阵行乘以向量行的最快方法

javascript - 基于条件jquery删除p标签

java - 如何实现可扩展的 switch case block ?

r - 过滤与事件第一次和最后一次发生相关的数据