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

时间:2015-10-27 06:39:31

标签: r

任务:

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

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

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

  4. 样本数据和所需输出如下所示。在此示例中,阈值为1000X是输入数据变量,所需输出为:Y = X(阈值> 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中的任何包的形式提供帮助。

2 个答案:

答案 0 :(得分:0)

这是一种使用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

答案 1 :(得分:0)

另一种方法:

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,并且仅在满足条件时才更改值。