如何删除矩阵中超过阈值的条目

时间:2019-05-15 19:52:48

标签: r

我的矩阵如下:

> ld1
           rs11721 rs3813199 rs3766186 rs7515488 rs6675798   rs6603785 rs11804831 rs11260930 rs221035 rs221045 rs2132851 rs12751725
rs3813199    0.565     1.000     0.988     0.567     0.448     0.351      0.160      0.003    0.001    0.001     0.001      0.001
rs3766186    0.553     0.988     1.000     0.560     0.438     0.343      0.155      0.003    0.001    0.001     0.001      0.001
rs7515488    0.447     0.567     0.560     1.000     0.565     0.595      0.342      0.003    0.000    0.000     0.000      0.000
rs6675798    0.494     0.448     0.438     0.565     1.000     0.752      0.383      0.000    0.000    0.000     0.000      0.000
rs6603785    0.544     0.351     0.343     0.595     0.752     1.000      0.454      0.000    0.000    0.000     0.000      0.000
rs11804831   0.289     0.160     0.155     0.342     0.383     0.454      1.000      0.002    0.001    0.001     0.001      0.001
rs11260930   0.000     0.003     0.003     0.003     0.000     0.000      0.002      1.000    0.284    0.284     0.243      0.243
rs221035     0.001     0.001     0.001     0.000     0.000     0.000      0.001      0.284    1.000    1.000     0.856      0.856

如何删除此矩阵中大于0.95但不等于1的所有条目?因此,我将所有数据都保持在0.95以下,而所有这些均等于1。

我尝试过:

md1 <- ld1[ld1[, ] <0.95, ]

但是它没有删除大于0.95的条目

我想删除这些条目,而不仅仅是将它们替换为NA。

3 个答案:

答案 0 :(得分:1)

如果您想使用NA进行回复,就足够了:

set.seed(1)
ld1 <- matrix(sample(1:1000, 81, replace = T)/1000, 9, 9)
diag(ld1) <- 1


ld1[ld1 > .95 & ld1 < 1] <- NA
ld1
       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]
 [1,] 1.000 0.062 0.381 0.383 0.795 0.790 0.071 0.333 0.347
 [2,] 0.373 1.000 0.778 0.870 0.108 0.024 0.100 0.651 0.334
 [3,] 0.573 0.177 1.000 0.341 0.724 0.478 0.317 0.259 0.477
 [4,] 0.909 0.688 0.213 1.000 0.412 0.733 0.519 0.479 0.893
 [5,] 0.202 0.385 0.652 0.600 1.000 0.693 0.663 0.767 0.865
 [6,] 0.899 0.770 0.126 0.494 0.648 1.000 0.407 0.085 0.390
 [7,] 0.945 0.498 0.268 0.187 0.783 0.862 1.000 0.876 0.778
 [8,] 0.661 0.718 0.387 0.828 0.554 0.439 0.294 1.000    NA
 [9,] 0.630    NA 0.014 0.669 0.530 0.245 0.460 0.840 1.000

如果您要删除包含任何值> .95的列行,就足够了。虽然,只要删除列或行,它就可以工作。如果这不是您要查找的内容,可以张贴您的预期输出:

remove_me <- which(ld1 > .95 & ld1 < 1, arr.ind = T)
ld1[-remove_me[,1], -remove_me[,2]]

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] 1.000 0.381 0.383 0.795 0.790 0.071 0.333
[2,] 0.373 0.778 0.870 0.108 0.024 0.100 0.651
[3,] 0.573 1.000 0.341 0.724 0.478 0.317 0.259
[4,] 0.909 0.213 1.000 0.412 0.733 0.519 0.479
[5,] 0.202 0.652 0.600 1.000 0.693 0.663 0.767
[6,] 0.899 0.126 0.494 0.648 1.000 0.407 0.085
[7,] 0.945 0.268 0.187 0.783 0.862 1.000 0.876

编辑:更新了答案和示例,假设它是主对角线上具有1.000的相关矩阵。我还假设除了主要对角线之外,没有完美的相关性。

答案 1 :(得分:0)

这是一种解决方案,方法是创建一个函数,该函数执行所需的操作,然后使用apply在所有矩阵元素上运行它。

remove_95 = function(x){
  ifelse(x > 0.95, NA, x)
}

apply(ld1, c(1,2), FUN = remove_95)

答案 2 :(得分:0)

我解决了熔化基质的问题:

{
    "account": {
        "type": "COMPANY"
    },
    "person": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "company": {
        "name": "XYZ Corp"
    }
}