Замените значения в матрице на NA, если имена строк / столбцов появляются в списке - PullRequest
2 голосов
/ 04 мая 2019

У меня есть матрица с соответствующими именами строк и столбцов.У меня также есть список с некоторыми именами строк / столбцов.В матрице я хочу заменить все ячейки строк и столбцов именами, НЕ включенными в список, на NA.

Вот матрица:

> A <- matrix(c(2,0,3,0,5,NA,1,0,NA,6,11,9,0,1,NA,2,0,1,NA,3,6,1,NA,0,0), nrow=5, ncol=5) 
> dimnames(A) = list(c("ID1", "ID2", "ID3", "ID4", "ID5"),  c("ID1", "ID2", "ID3", "ID4", "ID5"))
> A
    ID1 ID2 ID3 ID4 ID5
ID1   2  NA  11   2   6
ID2   0   1   9   0   1
ID3   3   0   0   1  NA
ID4   0  NA   1  NA   0
ID5   5   6  NA   3   0

Список можно посмотретькак это:

  B<-list("ID1","ID2","ID5")
[[1]]
[1] "ID1"

[[2]]
[1] "ID2"

[[3]]
[1] "ID5"

Результат должен выглядеть следующим образом:

    ID1 ID2 ID3 ID4 ID5
ID1   2  NA  NA  NA  6
ID2   0   1  NA  NA   1
ID3  NA  NA  NA  NA  NA
ID4  NA  NA  NA  NA  NA
ID5   5   6  NA  NA   0

Я пробовал следующее:

C <- A[A != B,A != B]<- NA
C <- A[(!(A[B,B]))]<- NA

... и некоторые версииэто, но я, очевидно, делаю что-то не так ... Спасибо за вашу помощь.

Ответы [ 3 ]

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

Вот вариант с использованием tidyverse

library(tidyverse)
library(reshape2)
v1 <- unlist(B)
melt(A) %>%
   mutate(value = replace(value, !((Var1  %in% v1) & 
                                   (Var2 %in% v1)), NA)) %>% 
   spread(Var2, value) %>%
   column_to_rownames('Var1')
#     ID1 ID2 ID3 ID4 ID5
#ID1   2  NA  NA  NA   6
#ID2   0   1  NA  NA   1
#ID3  NA  NA  NA  NA  NA
#ID4  NA  NA  NA  NA  NA
#ID5   5   6  NA  NA   0
1 голос
/ 04 мая 2019

Установите строки в NA, а затем столбцы в NA.Пакеты не используются.

A[!rownames(A) %in% unlist(B), ] <- NA
A[, !colnames(A) %in% unlist(B)] <- NA
1 голос
/ 04 мая 2019

Мы можем сгенерировать rownames и colnames матрицы, используя row и col и изменить их на NA, которые не соответствуют именам в B.

A[!(rownames(A)[row(A)] %in% unlist(B) & colnames(A)[col(A)] %in% unlist(B))] <- NA

A
#    ID1 ID2 ID3 ID4 ID5
#ID1   2  NA  NA  NA   6
#ID2   0   1  NA  NA   1
#ID3  NA  NA  NA  NA  NA
#ID4  NA  NA  NA  NA  NA
#ID5   5   6  NA  NA   0

Или, поскольку у вас есть матрица с совпадающими именами строк и столбцов, более простым для понимания подходом было бы сначала найти имена строк / столбцов, которые мы хотим изменить на NA, а затем изменить их на NAпоследовательно.

vals <- setdiff(rownames(A), unlist(B)) 
A[vals, ] <- NA     #Turn rows to NA
A[, vals] <- NA     #Turn columns to NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...