Getting index of first occurrence of a value in every column of a matrix

前端 未结 4 1327
野性不改
野性不改 2021-02-02 16:06

If I have a single vector, I can get the 1st occurrence which is below a value:

test <- c(0.5,0.8,0.1,0.08,0.06,0.04)
which(test<0.1)[1]    
相关标签:
4条回答
  • 2021-02-02 16:21

    As noted by Matthew, which.max does not return the correct value if there's no value <5 in a column (it returns 1, whereas the correct value is "nothing"). The match function is nice to handle this case:

    > test2 <- matrix(c(5,8,3,4, 7,5,6,7), ncol=2)
    > apply(test2<5, 2, which.max)
    [1] 3 1
    > apply(test2<5, 2, function(x) match(TRUE, x))
    [1]  3 NA
    
    0 讨论(0)
  • 2021-02-02 16:34

    Try this:

    test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2)
    > test2
         [,1] [,2]
    [1,]    5    7
    [2,]    8    5
    [3,]    3    6
    [4,]    4    2
    > foo <- function(x){which(x < 5)[1]}
    > apply(test2,2,foo)
    

    The key here being that you take the piece that you know works on a single vector, and simply wrap it in a function. apply will, well, apply that function to each column.

    0 讨论(0)
  • 2021-02-02 16:40

    Here's another answer. Assuming you mean test2 where you write test3, note that 'test2<5' is a logical vector. The minimum value will be FALSE. The maximum value (TRUE) is what you want:

    > apply(test2<5,2,which.max)
    [1] 3 4
    

    Note that this is not correct if the maximum value is not TRUE.

    0 讨论(0)
  • 2021-02-02 16:40

    Because I just stumbled upon this, here's another solution:

    max.col(t(test2 < 5), "first")
    
    0 讨论(0)
提交回复
热议问题