下面我有3列代码:一个组字段,一个商店的打开/关闭字段,以及为商店打开3个月的滚动总和。我也有所需的解决方案输出。
我的数据集可以被视为员工可用性。您可以假设每一行是不同的时间段(小时,天,月,年,等等)。在开/关栏中,无论员工是否在场,我都有。 3个月的滚动列是前一行的总和。
我要识别的是此滚动总和列中的非零值 <3>零行的间隙< / em>的。虽然此数据集中不存在,但您可以假设可能存在多个间隙&#39;零存在。
structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), X0_closed_1_open = c(0L,
1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), X3month_roll_open = c(0L,
0L, 1L, 2L, 2L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 1L, 1L, 1L,
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L), desired_solution = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("no", "yes"), class ="factor")), .Names = c("Group", "X0_closed_1_open", "X3month_roll_open", "desired_solution"), class = "data.frame", row.names = c(NA,
-26L))
答案 0 :(得分:0)
一个选项是:
res <- unsplit(
lapply(split(df1, df1$Group), function(x) {
rl <- with(x,rle(X3month_roll_open==0))
indx <- cumsum(c(0,diff(inverse.rle(within.list(rl,
values[values] <- lengths[values]>=3)))<0))
x$Flag <- indx!=0 & x[,3]!=0
x}),
df1$Group)
注意:而不是'是/否',最好使用'TRUE / FALSE'来简化子集化。
identical(c('no', 'yes')[res$Flag+1L], as.character(res$desired_solution))
#[1] TRUE