2014-03-25 48 views
0

我有一個變量爲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

您想在這裏使用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 
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