【问题标题】:Subset matrix based on cell values and drop rows/columns which don't satisfy a criterion基于单元格值的子集矩阵并删除不满足条件的行/列
【发布时间】:2016-05-23 11:36:24
【问题描述】:

我有一个 60*60 的矩阵,有点难以导航,我只想专注于矩阵中的某些值。所以我的想法是如果它们的值低于/高于某个阈值,则删除所有单元格,如果某个行/列中的所有值低于阈值,它们也会被删除。

假设我想删除值低于 0.5 的所有内容

示例输入:

              abcd       abcde          ab
abcd   0.000000000  0.44757748  0.61945319  
abcde  0.447577477  0.00000000  0.33773497  
ab     0.619453192  0.33773497  0.00000000 

示例输出:

          abcd          ab     
abcd                0.61945319 
ab     0.619453192  

所以在这种情况下,abcde 列的值没有超过 0.5 并且被完全删除(因为它是对称的,所以该行也被删除了)。此外,曾经持有数字的所有其他值现在都是空的。我已经简化了矩阵,可以很容易地看到我想要的单元格。现在,这是一个 3*3 矩阵,所以它不是很有用,但它可能对具有大量值的矩阵有用。

有没有办法做到这一点?

【问题讨论】:

  • 您可以在illustrated here 的条件下使用rowSumscolSums 来实现。例如:mat[rowSums(mat > 0.5) >= 1, ]

标签: r matrix subset


【解决方案1】:

为了删除0.5以上没有值的行和列,可以使用:

mat[rowSums(mat > 0.5) >= 1, colSums(mat > 0.5) >= 1]

给出:

          abcd        ab
abcd 0.0000000 0.6194532
ab   0.6194532 0.0000000

要替换单个值,请参阅@Oliver 的答案。替换为NA's 比替换为空字符值要好,因为后者会改变整个矩阵的值的类别。


使用过的数据:

mat <- structure(c(0, 0.447577477, 0.619453192, 0.44757748, 0, 0.33773497, 0.61945319, 0.33773497, 0), 
                 .Dim = c(3L, 3L), 
                 .Dimnames = list(c("abcd", "abcde", "ab"), c("abcd", "abcde", "ab")))

【讨论】:

    【解决方案2】:

    你可以试试:

    library(dplyr)
    library(tidyr)
    
    df %>%
      add_rownames() %>%
      gather(key, value, -rowname) %>%
      filter(value > 0.5) %>%
      spread(key, value, fill = "")
    

    这给出了:

    #Source: local data frame [2 x 3]
    #
    #  rowname         ab        abcd
    #    (chr)      (chr)       (chr)
    #1      ab            0.619453192
    #2    abcd 0.61945319            
    

    数据

    df <- structure(list(abcd = c(0, 0.447577477, 0.619453192), abcde = c(0.44757748, 
    0, 0.33773497), ab = c(0.61945319, 0.33773497, 0)), .Names = c("abcd", 
    "abcde", "ab"), class = "data.frame", row.names = c("abcd", "abcde", "ab"))
    

    【讨论】:

    • 最好使用fill = NA imo,因为这不会改变值的类别。
    • @ProcrastinatusMaximus 我同意。这实际上是非常低效的,并且导致用于进一步分析的数据结构不佳。我只是模仿了 OP 所需的输出。
    【解决方案3】:

    怎么样

    myMatrix[myMatrix < 0.5] <- NA
    

    【讨论】:

    • 谢谢,这也可以。只是一个简单的跟进:我将如何用这些新的 NA 值定义一个新矩阵,这样我就不会丢失原来的矩阵? (因为它已经通过 分配
    • @praznin 只是先用mymat2 &lt;- mymat 复制一份,然后用NA 替换。
    • 有道理!谢谢:)
    猜你喜欢
    • 2016-02-23
    • 2014-12-08
    • 2014-11-08
    • 1970-01-01
    • 2019-04-24
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多