【问题标题】:Delete rows/columns in matrix when values are only 0 across multiple matrices当多个矩阵中的值仅为 0 时,删除矩阵中的行/列
【发布时间】:2021-09-01 06:57:43
【问题描述】:

我有多个 n*n 矩阵,其中每个单元格包含值 0 或 1。我的目标是删除某个 ID 之后的所有 ID,其中行 和 列在 中只有 0我的数据集的所有矩阵。

这是一些数据:

m1 <- matrix(c(1,0,0,1,0,0,0,0,0,0,0,0), 4, 4)
m2 <- matrix(c(1,0,0,1,0,0,0,0,0,0,0,0), 4, 4)

在这个例子中,如果对应的行和列在两个矩阵中都只显示 0,我想检查 2 之后的每个 ID。在这里,ID 2&3 是这样:然后我想删除所有矩阵中的第 3 行和第 3 列,但保留第 2 行和第 2 列。

如你所想,我的数据集要大得多,这不能手动完成。

我试过了:

m1b <- m1 [which(rowSums(m1[3:4,]) > 0 & colSums(m1[3:4,]) > 0), ]

但这省略了前 2 行,只检查一个矩阵。任何帮助表示赞赏。

【问题讨论】:

    标签: r matrix filter


    【解决方案1】:
    1. 您必须将列条件放在逗号之后
    2. 您的行条件在m1[3:4,] 上,但您在m1 上应用它。 which(rowSums(m1[3:4,]) &gt; 0) 返回 2,但它是 m1 的第 4 行,您需要将 2 添加到结果中,并告诉您希望通过将结果与 1 和 2 连接来保留前 2 行

    对于一个矩阵,你可以这样做:

    m1[c(1, 2, 2 + which(rowSums(m1[3:4,]) > 0)), which(colSums(m1[3:4,]) > 0)]
    

    或

    m1[c(rep(TRUE, 2), rowSums(m1[3:4,]) > 0), colSums(m1[3:4,]) > 0]
    

    现在,要获得多个矩阵的条件,您可以在布尔向量之间使用&amp;

    columnToKeep <- (colSums(m1[3:4,]) > 0) & (colSums(m2[3:4,]) > 0)
    rowToKeep <- (c(rep(TRUE, 2), rowSums(m1[3:4,]) > 0)) & (c(rep(TRUE, 2), rowSums(m2[3:4,]) > 0))
    m1[rowToKeep, columnToKeep]
    m2[rowToKeep, columnToKeep]
    

    【讨论】:

    • 谢谢,这已经很有帮助了。我做了以下事情: columnToKeep 0 & colSums(s2016id[,115:248]) > 0) rowToKeep 0 & rowSums(s2016id[115:248,]) > 0) 但是,当将其应用于这样的矩阵时: s2015id_b
    • 抱歉,这看起来如此混乱 - 我不知道 cmets 不允许格式化。
    • 你需要添加多个 TRUE 等价于你想要保留的前 n 行 c(rep(TRUE, 114), rowSums(s2015id[115:248,]) &gt; 0))
    • 您可以阅读adv-r.hadley.nz/subsetting.html,了解如何对向量、矩阵进行子集化...
    • 非常感谢,昆汀。这非常有效,我将阅读您的链接,以提高我对子集和 R 语法的理解。
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多