如果我有一个向量,我可以得到低于值的第一次出现:
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)
将apply
与which
一起使用会返回一个列表:
> apply(test2<5,2,which)
[[1]]
[1] 3 4
[[2]]
[1] 4
同时使用apply
which.min
为所有列返回1
:
> apply(test2<5,2,which.min)
[1] 1 1
然而,我想要的只是返回[1] 3 4
- 我错过了一些明显的东西吗?
答案 0 :(得分:7)
这是另一个答案。假设你的意思是test2你写test3,请注意'test2&lt; 5'是一个逻辑向量。最小值为FALSE。最大值(TRUE)是您想要的:
> apply(test2<5,2,which.max)
[1] 3 4
请注意,如果最大值不为TRUE,则这不正确。
答案 1 :(得分:5)
试试这个:
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 :(得分:4)
因为我偶然发现了这个,这是另一个解决方案:
max.col(t(test2 < 5), "first")
答案 3 :(得分:0)
如Matthew所述,如果列中没有值&lt; 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