首页 文章

获取矩阵每列中第一次出现值的索引

提问于
浏览
14

如果我有一个向量,我可以得到低于值的第一个出现:

test <- c(0.5,0.8,0.1,0.08,0.06,0.04)
which(test<0.1)[1]

这正确地给出了答案 4 . 但是,如何在矩阵的每列中首次出现,例如在以下2列矩阵中的5次以下出现:

test2 <- matrix(c(5,8,3,4,7,5,6,2),ncol=2)

使用 applywhich 返回一个列表:

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

[[2]]
[1] 4

使用 applywhich.min 对所有列返回 1

> apply(test2<5,2,which.min)
[1] 1 1

然而,我想要的只是回归 [1] 3 4 - 我错过了一些明显的东西吗?

4 回答

  • 0

    这是另一个答案 . 假设你的意思是test2你写test3,请注意'test2 <5'是一个逻辑向量 . 最小值为FALSE . 最大值(TRUE)是您想要的:

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

    请注意,如果最大值不为TRUE,则这不正确 .

  • 7

    试试这个:

    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)
    

    这里的关键是你把你知道的作品放在一个矢量上,然后简单地将它包装在一个函数中 . apply 将把这个功能应用到每一列 .

  • 4

    因为我偶然发现了这个,这是另一个解决方案:

    max.col(t(test2 < 5), "first")
    
  • 5

    如Matthew所述,如果列中没有值<5,则 which.max 不会返回正确的值(它返回 1 ,而正确的值是"nothing") . match 函数很好处理这种情况:

    > 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
    

相关问题