子集矩阵基于单元格值和删除不符合标准的行/列

时间:2016-05-23 11:36:25

标签: r matrix subset

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

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

示例输入:

    <input id="id1" type="number" max="100" min="40">

    <button onclick="count()">OK</button>

    <p id="test"></p>

<script>    

var inpObj = document.getElementById('id1');

    function count() {
        if(inpObj.checkValidity() == false || inpObj.length === 0) {
            document.getElementById('test').innerHTML = inpObj.validationMessage;
        } else {
            document.getElementById('test').innerHTML = "Input OK";
        }
    }

</script>

示例输出:

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

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

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:2)

要删除没有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比使用空字符值替换更好,因为后者将更改整个矩阵的值类。

使用过的数据:

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")))

答案 1 :(得分:1)

你可以尝试:

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"))

答案 2 :(得分:0)

怎么样?
myMatrix[myMatrix < 0.5] <- NA