【问题标题】:Count negatives if at least six consecutive negative values in a column如果一列中至少有六个连续的负值,则计算负数
【发布时间】:2016-02-02 21:33:32
【问题描述】:

我有一个包含每小时值的 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 个否定,因此不计算在内。

【问题讨论】:

  • 你有没有尝试过?你被困在哪里了?
  • 我在这里搜索了类似的问题,并找到了类似的解决方案:stackoverflow.com/questions/19998836/… 但我不知道这是否也适用于我的问题,以及是否,如何适应,因为我对 R 没有那么丰富的经验。

标签: r


【解决方案1】:

试试:

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

【讨论】:

  • 这是一个很好的答案。比我想象的要简洁得多!
  • 感谢 Tgsmith!我总是尽量保持代码简洁。引用丘吉尔的话:“最好的演讲是最短的”。我认为这也适用于代码:-)
【解决方案2】:

您始终可以定义自己的函数并调用它。

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)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多