在行或行之前运行指定值的计数。不连续计数

时间:2014-03-25 19:14:18

标签: r count dataframe running-total

我有一个变量为v1的数据框。我希望变量v2是行的零运行计数(即在该行之前和之前只计数零)。 Conversley,我希望v3成为非零数字的运行计数。数据框dat说明了所需的输出。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您想在此处使用cumsum作为给定条件的累积总和。

> 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