在一组观察中检查给定阈值的值,并继续直到向量结束

  • 本文关键字:阈值 继续 结束 向量 一组 观察 r
  • 更新时间 :
  • 英文 :


任务:

  1. 我必须检查数据向量中的值是否高于给定阈值,

  2. 如果在我的数据向量中,我发现5个连续的值大于给定的阈值,那么我保持这些值不变。

  3. 如果我有少于5个值(不是连续的5个值),那么我将用NA替换这些值。

示例数据和所需输出如下所示。本例中阈值为"1000"。X为输入数据变量,期望输出为:Y = X(Threshold> 1000)

  X      Y
 580   580 
 457   457 
 980   980 
1250    NA 
3600    NA 
 598   598 
1200  1200 
1345  1345 
9658  9658 
1253  1253 
4500  4500
1150  1150 
 596   596 
 594   594
 550   550 
1450    NA 
 320   320 
1780    NA 
 592   592 
 590   590 

我在R中使用了以下代码来获得我想要的输出,但无法获得适当的输出:

for (i in 1:nrow(X)) # X is my data vector
{counter=0  
if (X[i]>10000)
{
    for (j in i:(i+4))
    { 
       if (X[j]>10000) 
        {counter=counter+1}
    }
    ifelse (counter < 5, NA, X[j])
    }
    X[i]<- NA
}
X

我确信上面的代码包含一些错误。我需要帮助的形式,无论是一个新的代码或修改此代码或任何包在r

这里是一种使用dplyr的方法,使用diff(x > 1000)的累积和对值进行分组。

library(dplyr)
df <- data.frame(x)
df
# x
# 1   580
# 2   457
# 3   980
# 4  1250
# 5  3600
# 6   598
# 7  1200
# 8  1345
# 9  9658
# 10 1253
# 11 4500
# 12 1150
# 13  596
# 14  594
# 15  550
# 16 1450
# 17  320
# 18 1780
# 19  592
# 20  590
df %>% mutate(group = cumsum(c(0, abs(diff(x>1000))))) %>%
    group_by(group) %>%
    mutate(count = n()) %>%
    ungroup() %>%
    mutate(y = ifelse(x<1000 | count > 5, x, NA))
# x group count     y
# (int) (dbl) (int) (int)
# 1    580     0     3   580
# 2    457     0     3   457
# 3    980     0     3   980
# 4   1250     1     2    NA
# 5   3600     1     2    NA
# 6    598     2     1   598
# 7   1200     3     6  1200
# 8   1345     3     6  1345
# 9   9658     3     6  9658
# 10  1253     3     6  1253
# 11  4500     3     6  4500
# 12  1150     3     6  1150
# 13   596     4     3   596
# 14   594     4     3   594
# 15   550     4     3   550
# 16  1450     5     1    NA
# 17   320     6     1   320
# 18  1780     7     1    NA
# 19   592     8     2   592
# 20   590     8     2   590

另一种方法:

Y<-rep(NA,nrow(X))
for (i in 1:nrow(X)) {
    if (X[i,1]<1000) {Y[i]<-X[i,1]} else if (sum(X[i:min((i+4),nrow(X)),1]>1000)>=5) {
     Y[i:min((i+4),nrow(X))]<-X[i:min((i+4),nrow(X)),1]} 
}    

返回
> Y
 [1]  580  457  980   NA   NA  598 1200 1345 9658 1253 4500 1150  596  594  550   NA  320   NA  592  590

假设X的值位于名为X的数据框的第一列中。然后用NA创建Y,只有在满足条件时才更改值。

最新更新