如何获取值首次低于阈值(按行)的索引?

时间:2019-04-29 14:24:36

标签: r performance

我有很多值,我想连续第一个获得低于阈值的值。

我尝试了以下代码:

Threshold<-NULL
t <- 0.75
for(i in 1:dim(Tab)[1]){
  k <- 2
  if(is.na(Tab[i,k])){
    while(((k < dim(Tab)[2])) & (is.na(Tab[i,k]))){
      k <- k+1
    }
  }
  while(((k < dim(Tab)[2]) & (t < Tab[i,k]))){
    k <- k+1
  }
  Threshold[i] <- k
}

但是运行需要很多时间...

例如:

我有这个数据框:

Id |   a    |   b   |   c   |   d   |
1  |  0.9   |  0.8  |  0.7  |  0.6  |
2  |  0.55  |  0.4  |  0.8  |  0.2  |
3  |  0.9   |  0.8  |  0.8  |  0.8  |
4  |  0.8   |  0.7  |  1.1  |  0.5  |
5  |   NA   |   NA  |  0.8  |  0.7  |

我正在尝试获得以下结果:

Threshold= (4 , 2 , NA , 3 , 5)

有更快的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以使用max.col来获取每行中第一个元素的位置,该位置小于阈值。使用rowSums创建一个逻辑索引,以说明没有少于阈值的元素的行并将其设置为NA

(max.col(df1[-1] <= 0.7 & !is.na(df1[-1]), "first") + 1) *
        NA^(!rowSums(df1[-1] <= 0.7, na.rm = TRUE))