识别显示模式的数据框中的行

时间:2015-03-29 01:24:29

标签: r dataframe pattern-matching match

下面我有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))

1 个答案:

答案 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