【问题标题】:Getting index of first occurrence of a value in every column of a matrix获取矩阵每一列中第一次出现的值的索引
【发布时间】:2012-05-28 18:52:48
【问题描述】:

如果我有一个向量,我可以得到低于某个值的第一个匹配项:

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 - 我是否遗漏了一些明显的东西?

【问题讨论】:

    标签: r


    【解决方案1】:

    试试这个:

    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 会将该函数应用于每一列。

    【讨论】:

    • 谢谢 - 我应该能够自己解决这个问题!看到答案就很简单了……
    【解决方案2】:

    这是另一个答案。假设您的意思是您编写 test3 的 test2,请注意“test2

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

    请注意,如果最大值不是 TRUE,则这是不正确的。

    【讨论】:

    • 是的 - 这也有效!将其应用于更大的结果集时,我得到与使用其他答案相同的结果
    【解决方案3】:

    正如 Matthew 所指出的,如果列中没有值 which.max 不会返回正确的值(它返回 1,而正确的值是“无”)。 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
    

    【讨论】:

      【解决方案4】:

      因为我只是偶然发现了这个,所以这里有另一个解决方案:

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

      【讨论】:

        猜你喜欢
        • 2014-07-15
        • 1970-01-01
        • 2016-07-09
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-19
        相关资源
        最近更新 更多