如果列中至少有六个连续的负值,则计算负数

时间:2015-11-02 21:19:39

标签: r

我有一个带有小时值的data.frame列,并且想要计算所有负值,如果它们是至少连续六个负数的序列。

示例:

df <- data.frame(Values=c(-2, 2, 3, 4,-1,-1,-2,-3,
                          -1,-1,-1, 5, 4, 2,-4,-2,
                          -3,-4,-1, 3, 4, 4,-3,-1,
                          -2,-2,-3,-4))

预期结果为13,因为连续负数的中间序列仅包含5个负数,因此不计算。

3 个答案:

答案 0 :(得分:3)

您可以使用基本功能rle()sign()sign()函数将负数和正数分别转换为-1和1。这使得一个很好的向量传递给rle()以获得运行长度。然后我们可以使用所需条件对游程长度进行子集化并获取总和。

with(rle(sign(df$Values)), sum(lengths[lengths >= 6 & values < 0]))
# [1] 13

答案 1 :(得分:1)

尝试:

library(cgwtools)
res <- seqle(which(df<0))
sum(res$lengths[res$lengths>=6])
[1] 13

答案 2 :(得分:0)

您可以随时定义自己的功能并进行调用。

NegativeValues <- function(x) {
   count <- 0
   innercount <- 0
   for (i in c(x, 0)) {
      if (i < 0) {
         innercount <- innercount + 1
      }
      else {
         if (innercount >= 6)
            count <- count + innercount
         innercount <- 0
      }      
   }
   return(count)
}

NegativeValues(df$Values)