2015-03-29 1 views
1

Ниже у меня есть код с тремя столбцами: поле для группы, поле открытия/закрытия для магазина и текущая сумма в 3 месяца для магазина. У меня также есть желаемый выход решения.идентификация строк в кадре данных, которые отображают шаблоны

Мой набор данных можно охарактеризовать как наличие сотрудников. Вы можете предположить, что каждая строка будет другим периодом времени (час, день, месяц, год, что угодно). В открытой/закрытой колонке я имею, присутствовал ли сотрудник. Столбец 3month roll представляет собой сумму предыдущих строк.

Я хочу, чтобы определить это ненулевые значения в этом столбце прокатки суммы следующие разрыв по меньшей мере 3 нулевых строк для этой конкретной группы. Если в этом наборе данных нет данных, вы можете предположить, что может быть больше одного «пробела» присутствующих нулей.

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

Один из вариантов:

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 
Смежные вопросы