我有一个带有小时值的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个负数,因此不计算。
答案 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)