Как определить, какие столбцы не являются «NA» на строку в матрице? - PullRequest
11 голосов
/ 16 сентября 2011

У меня есть матрица с 12 строками и 77 столбцами, но просто давайте использовать:

p <- matrix(NA,5,7)  
p[1,2]<-0.3  
p[1,3]<-0.5  
p[2,4]<-0.9  
p[2,7]<-0.4  
p[4,5]<-0.6 

Я хочу знать, какие столбцы не являются «NA» для каждой строки, так что я хотел бы получить что-то вроде:

[1] 2,3  
[2] 4  
[3] 0  
[4] 5  
[5] 0 

но если я сделаю > which(p[]!="NA"), я получу [1] 6 11 17 24 32

Я попытался использовать цикл:

aux <- matrix(NA,5,7)  
for(i in 1:5) {  
    aux[i,]<-which(p[i,]!="NA")  
}

но я просто получаю сообщение об ошибке: number of items to replace is not a multiple of replacement length

Есть ли способ сделать это? Заранее спасибо

1 Ответ

23 голосов
/ 16 сентября 2011

Попробуйте:

which( !is.na(p), arr.ind=TRUE)

То, что я считаю столь же информативным и, вероятно, более полезным, чем указанный вами вывод, но если вы действительно хотите использовать версию списка, то это можно использовать:

> apply(p, 1, function(x) which(!is.na(x)) )
[[1]]
[1] 2 3

[[2]]
[1] 4 7

[[3]]
integer(0)

[[4]]
[1] 5

[[5]]
integer(0)

Или даже со смазкой вместе с пастой:

lapply(apply(p, 1, function(x) which(!is.na(x)) ) , paste, collapse=", ")

Выходные данные из функции which предложенного метода доставляют строку и столбец ненулевых (ИСТИНА) местоположений логических тестов:

> which( !is.na(p), arr.ind=TRUE)
     row col
[1,]   1   2
[2,]   1   3
[3,]   2   4
[4,]   4   5
[5,]   2   7

Если для параметра arr.ind не установлено значение ИСТИНА по умолчанию, вы получите только «векторное местоположение», определенное с использованием мажорного столбца, упорядоченного по R в качестве соглашения. R-матрицы являются просто «сложенными векторами».

> which( !is.na(p) )
[1]  6 11 17 24 32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...