How to find the row-wise index of non-NA values in a matrix in R?


A matrix can also contain missing values and those missing values can be placed in a matrix by randomization as well, hence we cannot be sure about the positions of those values that are referred to as NA and the non-missing values. If we want to find the positions of the non-missing values in a matrix then apply function can be used where we can use which function to exclude NA values. Check out the below examples to understand how it works.

Example1

 Live Demo

M1<−matrix(sample(c(NA,0,1),25,replace=TRUE),ncol=5)
M1

Output

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

Example

apply(M1,1,function(x) which(!is.na(x)))

Output

[[1]]
[1] 2 4 5
[[2]]
[1] 1 2 4 5
[[3]]
[1] 1 2 3 4 5
[[4]]
[1] 1 3 4 5
[[5]]
[1] 1 3 4

Example2

 Live Demo

M2<− matrix(sample(c(NA,5,10,15,25),49,replace=TRUE),nrow=7)
M2

Output

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]  NA   NA   15   NA   10   15   5
[2,]  5    5    15   15   NA   10   25
[3,]  NA   5    NA   10   25   10   10
[4,]  5    25   NA   NA   10   5    NA
[5,]  25   NA   15   5    15   10   5
[6,]  25   NA   10   NA   25   5    15
[7,]  10   5    25   NA   10   5    25

Example

apply(M2,1,function(x) which(!is.na(x)))

Output

[[1]]
[1] 3 5 6 7
[[2]]
[1] 1 2 3 4 6 7
[[3]]
[1] 2 4 5 6 7
[[4]]
[1] 1 2 5 6
[[5]]
[1] 1 3 4 5 6 7
[[6]]
[1] 1 3 5 6 7
[[7]]
[1] 1 2 3 5 6 7

Example3

 Live Demo

M3<−matrix(sample(c(NA,0:9),100,replace=TRUE),nrow=10)
M3

Output

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]  1    0   2    2    2    0    4    5    9    4
[2,]  0    4   5    2    6    3    3    8    6    2
[3,]  8   NA   6    4    7    1    7    5    5    6
[4,] NA   4    7    4    5    4    NA   1    0    5
[5,]  7   4    3    1    1    0    5    1    7    7
[6,]  3   8    5    8    3    1    2    2    3    4
[7,]  5   4    3    NA   0    8    3    5    9    6
[8,]  7   7    7    6    1    0    7    NA   6    7
[9,]  9   5    3    2    4    2    3    4    3    8
[10,] 1   3    6    4    4    1    8    0    4    1

Example

apply(M3,1,function(x) which(!is.na(x)))

Output

[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] 1 2 3 4 5 6 7 8 9 10
[[3]]
[1] 1 3 4 5 6 7 8 9 10
[[4]]
[1] 2 3 4 5 6 8 9 10
[[5]]
[1] 1 2 3 4 5 6 7 8 9 10
[[6]]
[1] 1 2 3 4 5 6 7 8 9 10
[[7]]
[1] 1 2 3 5 6 7 8 9 10
[[8]]
[1] 1 2 3 4 5 6 7 9 10
[[9]]
[1] 1 2 3 4 5 6 7 8 9 10
[[10]]
[1] 1 2 3 4 5 6 7 8 9 10

Example4

 Live Demo

M4<−matrix(sample(c(NA,rnorm(10,5,2)),36,replace=TRUE),nrow=6)
M4

Output

       [,1]      [,2]      [,3]    [,4]      [,5]     [,6]
[1,] 5.8658749 3.4589638  9.448970 4.0246447 5.0317765 3.4589638
[2,] 9.4489696 9.1581552  5.865875 3.8337310 5.9396619 5.9396619
[3,] 4.0246447 7.5142676  NA 9.4489696 0.9925749 5.0317765
[4,] 7.5142676 5.8658749  3.833731 0.9925749 0.9925749 7.5142676
[5,] 0.9925749 7.5142676  NA 9.1581552 9.4489696 NA
[6,] 5.0317765 0.9925749  3.833731 4.0246447 7.5142676 0.9925749

Example

apply(M4,1,function(x) which(!is.na(x)))

Output

[[1]]
[1] 1 2 3 4 5 6
[[2]]
[1] 1 2 3 4 5 6
[[3]]
[1] 1 2 4 5 6
[[4]]
[1] 1 2 3 4 5 6
[[5]]
[1] 1 2 4 5
[[6]]
[1] 1 2 3 4 5 6

Example5

 Live Demo

M5<−matrix(sample(c(NA,rpois(10,5)),64,replace=TRUE),nrow=8)
M5

Output

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 10 0 7 5 3 10 10 10
[2,] 5 3 NA 5 5 5 5 5
[3,] 5 5 3 5 3 5 7 5
[4,] 3 10 5 10 NA NA 5 5
[5,] 7 7 7 5 7 10 8 7
[6,] 0 3 7 3 7 5 3 10
[7,] 0 NA 5 NA 7 NA 0 5
[8,] 5 10 8 7 3 NA 8 3

Example

apply(M5,1,function(x) which(!is.na(x)))

Output

[[1]]
[1] 1 2 3 4 5 6 7 8
[[2]]
[1] 1 2 4 5 6 7 8
[[3]]
[1] 1 2 3 4 5 6 7 8
[[4]]
[1] 1 2 3 4 7 8
[[5]]
[1] 1 2 3 4 5 6 7 8
[[6]]
[1] 1 2 3 4 5 6 7 8
[[7]]
[1] 1 3 5 7 8
[[8]]
[1] 1 2 3 4 5 7 8

Updated on: 06-Nov-2020

409 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements