2011-09-16 32 views
9

Tôi có một ma trận với 12 hàng và 77 cột, nhưng chỉ đơn giản là cho phép sử dụng:Cách xác định cột nào không phải là "NA" trên mỗi hàng trong ma trận?

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 

Tôi muốn biết cột không phải là "NA" cho mỗi hàng, vì vậy những gì tôi muốn có được sẽ là một cái gì đó như:

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

nhưng nếu tôi làm > which(p[]!="NA") tôi nhận được [1] 6 11 17 24 32

tôi đã cố gắng sử dụng một vòng lặp:

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

nhưng tôi chỉ gặp lỗi: number of items to replace is not a multiple of replacement length

Có cách nào để thực hiện việc này không? Cảm ơn trước

Trả lời

16

Hãy thử:

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

Mà tôi nghĩ là cũng giống như nhiều thông tin và có lẽ nhiều hữu ích hơn so với sản lượng mà bạn chỉ định, Nhưng nếu bạn thực sự muốn phiên bản danh sách, sau đó điều này có thể được sử dụng:

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

Hoặc thậm chí với smushing cùng với dán:

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

sản lượng từ which chức năng phương pháp đề nghị cung cấp các hàng và cột của non-zero (TRUE) địa điểm của các bài kiểm tra logic:

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

Nếu không có sự arr.ind tham số thiết lập để không phải mặc định TRUE, bạn chỉ nhận được những "vector location" xác định sử dụng thứ tự cột lớn mà R đã đặt làm quy ước của nó. R-ma trận chỉ là "vectơ gấp".

> which(!is.na(p)) 
[1] 6 11 17 24 32 
+0

Và cuối cùng kiểm tra có thể được thêm chiều dài()> 0 để trả về 0 thay vì số nguyên (0). – joran

+0

Sản lượng thu gọn, thu gọn sẽ tạo ra các phần tử ký tự rỗng, '" "', chứ không phải là số nguyên (0). –

Các vấn đề liên quan