Как удалить записи в матрице, которые превышают порог - PullRequest
0 голосов
/ 15 мая 2019

моя матрица выглядит так:

> 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 ]

1 голос
/ 15 мая 2019

Если вы хотите изменить с 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 на главной диагонали.Я также предположил, что не было бы совершенных корреляций кроме главной диагонали.

0 голосов
/ 15 мая 2019

Я решил свою проблему с расплавлением матрицы:

library(reshape2)
ld1$snp1 <- rownames(ld1)
m = melt(ld1, id.vars = "snp1", value.name = "r2",variable.name = "snp2")

> head(m)
       snp1    snp2    r2
1   rs11721 rs11721 1.000
2 rs3813199 rs11721 0.565
3 rs3766186 rs11721 0.553
4 rs7515488 rs11721 0.447
5 rs6675798 rs11721 0.494
6 rs6603785 rs11721 0.544
# find teh subset which to extract from the m data frame
r1=m[m$r2 > .95 & m$snp1 != m$snp2,]
d=setdiff(m,r1)
0 голосов
/ 15 мая 2019

Вот решение, создав функцию, которая делает то, что вы хотите, и затем примените команду apply, чтобы запустить ее над всеми элементами матрицы.

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

apply(ld1, c(1,2), FUN = remove_95)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...