多种条件下的增量

时间:2014-11-27 09:52:57

标签: r

这个问题是this的附加内容。我认为附加条件足以创造一个新问题。

我的数据框为date s和event s,如下所示。

data <- data.frame( date= as.Date(c(rep("24.07.2012",12), rep("25.07.2012",8)), format="%d.%m.%Y"), 
                    event=rep(0,20)   )
data$event[10] <- 1
data$event[15] <- 1

我想添加一个start计数器列,该列在10&amp; s中递增并重置:

    在观察到事件= 1之后
  • 1)
  • 2)当日期从上一行更改时。

因此,此附加start列的所需输出为:

         date   event start
1  2012-07-24     0     0
2  2012-07-24     0    10
3  2012-07-24     0    20
4  2012-07-24     0    30
5  2012-07-24     0    40
6  2012-07-24     0    50
7  2012-07-24     0    60
8  2012-07-24     0    70
9  2012-07-24     0    80
10 2012-07-24     1    90
11 2012-07-24     0     0
12 2012-07-24     0    10
13 2012-07-25     0     0
14 2012-07-25     0    10
15 2012-07-25     1    20
16 2012-07-25     0     0
17 2012-07-25     0    10
18 2012-07-25     0    20
19 2012-07-25     0    30
20 2012-07-25     0    40

linked question有非常好的解决方案,只能满足条件 1

添加条件2后,我们现在需要跟踪date行的(n-1)th值。所以我猜这使解决方案变得复杂。

在没有for循环的情况下解决此问题的任何想法?

2 个答案:

答案 0 :(得分:4)

library(data.table)
setDT(data)
data[, start := 10 * (seq_along(event) - 1), 
     by=list(date, cumsum(c(1L, diff(event) == -1L)))]
#turn the data.table into a data.frame:
class(data) <- "data.frame"

正如@David Arenburg提醒我的那样,现在有setDF基本相同和一些额外的清理工作。

data
#         date event start
#1  2012-07-24     0     0
#2  2012-07-24     0    10
#3  2012-07-24     0    20
#4  2012-07-24     0    30
#5  2012-07-24     0    40
#6  2012-07-24     0    50
#7  2012-07-24     0    60
#8  2012-07-24     0    70
#9  2012-07-24     0    80
#10 2012-07-24     1    90
#11 2012-07-24     0     0
#12 2012-07-24     0    10
#13 2012-07-25     0     0
#14 2012-07-25     0    10
#15 2012-07-25     1    20
#16 2012-07-25     0     0
#17 2012-07-25     0    10
#18 2012-07-25     0    20
#19 2012-07-25     0    30
#20 2012-07-25     0    40

答案 1 :(得分:0)

作为参考,这是一个丑陋的for循环答案,我想避免:

# for loop solution
data$start_loop <- rep (0, nrow(data))
for (r in 2:nrow(data)) {
  if( (data$event[r-1] == 1) | (data$date[r] != data$date[r-1] ) ){
    data$start_loop[r] = 0
  }
  else {
    data$start_loop[r] <- data$start_loop[r-1] + 10
  }
}