15

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

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)

使用applywithwhich返回一个列表:

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

[[2]]
[1] 4

使用applywithwhich.min返回1所有列时:

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

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

4

4 回答 4

8

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

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

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

于 2012-05-28T19:04:04.983 回答
6

试试这个:

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

于 2012-05-28T19:01:01.660 回答
4

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

max.col(t(test2 < 5), "first")
于 2013-02-12T15:33:42.900 回答
1

正如 Matthew 所指出的,which.max如果列中没有值 <5,则不会返回正确的值(它返回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
于 2016-07-23T11:16:53.990 回答