我有很多值,我想连续第一个获得低于阈值的值。
我尝试了以下代码:
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)
有更快的方法吗?
谢谢!
答案 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))