Reputation: 2091
I have a data frame with variable v1
. I want a variable v2
to be the running count of zeros at the row (i.e. only count zeros at and before that row). Conversley, I'd like v3
to be the running count of non-zero numbers. The data frame dat
illustrate the desired output.
dat <- structure(list(v1 = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 10L,
2L, 0L), v2 = c(1L, 2L, 2L, 3L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L
), v3 = c(0L, 0L, 1L, 1L, 1L, 1L, 2L, 3L, 4L, 5L, 6L, 6L)), .Names = c("v1",
"v2", "v3"), class = "data.frame", row.names = c(NA, -12L))
> dat
v1 v2 v3
1 0 1 0
2 0 2 0
3 1 2 1
4 0 3 1
5 0 4 1
6 0 5 1
7 1 5 2
8 1 5 3
9 1 5 4
10 10 5 5
11 2 5 6
12 0 6 6
Upvotes: 0
Views: 107
Reputation: 99321
You want to use cumsum
here, for the cumulative sum(s) of a given condition.
> v1 <- c(0, 0, 1, 0, 0, 0, 1, 1, 1, 10, 2, 0)
> v2 <- cumsum(v1 == 0)
> v3 <- cumsum(v1 > 0)
> data.frame(v1, v2, v3)
## v1 v2 v3
## 1 0 1 0
## 2 0 2 0
## 3 1 2 1
## 4 0 3 1
## 5 0 4 1
## 6 0 5 1
## 7 1 5 2
## 8 1 5 3
## 9 1 5 4
## 10 10 5 5
## 11 2 5 6
## 12 0 6 6
Upvotes: 2
Reputation: 20811
within(dat, {
v33 <- cumsum(v1 != 0)
v22 <- cumsum(v1 == 0)
})
# v1 v2 v3 v22 v33
# 1 0 1 0 1 0
# 2 0 2 0 2 0
# 3 1 2 1 2 1
# 4 0 3 1 3 1
# 5 0 4 1 4 1
# 6 0 5 1 5 1
# 7 1 5 2 5 2
# 8 1 5 3 5 3
# 9 1 5 4 5 4
# 10 10 5 5 5 5
# 11 2 5 6 5 6
# 12 0 6 6 6 6
Upvotes: 2