计算连续出现的次数,一旦发现值就停止

时间:2018-10-05 04:06:16

标签: r cumulative-sum

我有一个看起来像这样的数据框:

<!DOCTYPE html>
<html>
	<body>
		<h2>What can Javascript do?</h2>
		
		<p id="demo">JavaScript can change HTML content.</p>
		
		<button type = "button" onclick = 'document.getElementById("demo").innerHTML = "Hello JavaScript!";document.getElementById("demo").style.fontSize="45px"'>Do both!</button>
		
	</body>
</html>

我想要一个看起来像这样的输出:

account <- c('123','123','123','123')
bin <- c(3,6,9,12)
count <- c(0,0,2,0)

df <- data.frame(account,bin,count)
df
> df
  account bin count
1     123   3     0
2     123   6     0
3     123   9     2
4     123  12     0

基本上,我需要计算从 > df account bin count cumCount 1 123 3 0 1 2 123 6 0 2 3 123 9 2 0 4 123 12 0 0 开始的连续调零器的数量。但是一旦bin = 3列为count,我希望其余的值都为零。

我在网上浏览了一下,这里几乎有2部分解决方案:

>0

df %>% 
  group_by(count) %>% 
  mutate(id = row_number())


# A tibble: 4 x 4
# Groups:   count [2]
  account   bin count    id
   <fctr> <dbl> <dbl> <int>
1     123     3     0     1
2     123     6     0     2
3     123     9     2     1
4     123    12     0     3

,但是在找到零后,它们仍然保持计数。
还有其他解决方案吗?

1 个答案:

答案 0 :(得分:3)

我们首先可以创建一个行号列cumCount。然后,从第一次出现的非零值到数据帧的末尾,将索引的值替换为0。

df$cumCount = 1:nrow(df)
df$cumCount[which.max(df$count != 0) : nrow(df)] <- 0

df

#  account bin count cumCount
#1     123   3     0        1
#2     123   6     0        2
#3     123   9     2        0
#4     123  12     0        0

dplyr中,使用row_numberreplace函数更容易

library(dplyr)
df %>%
   mutate(cumCount = replace(row_number(), cumsum(count!=0) > 0, 0))


#  account bin count cumCount
#1     123   3     0        1
#2     123   6     0        2
#3     123   9     2        0
#4     123  12     0        0

上述dplyr版本的等效基数R为

df$cumCount <- replace(1:nrow(df), cumsum(df$count != 0) > 0, 0)