这个问题是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中递增并重置:
因此,此附加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
循环的情况下解决此问题的任何想法?
答案 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
}
}