Подстановка данных панели с помощью уникальных значений

Я хотел бы сегментировать данные панели по определенному критерию и выполнять сводную статистику по каждому сегменту. Данные:

  store year    rev space  market
      1 2004 110000  1095     136
      1 2005 110000  1095     136
      1 2006 110000  1095     136
      1 2007 120000  1095     136
      2 2004  35000   800     136
      3 2004  45000  1000     136
      3 2005  45000  1000     136
      3 2006  45000  1000     136
      3 2007  45000  1000     136
      4 2005  17500   320     136
      4 2006  17500   320     136
      4 2007  17500   320     136
      5 2005  45000   580     191
      5 2006  45000   580     191
      5 2007  45000   580     191
      6 2004   7000   345     191
      6 2005   7000   345     191
      6 2006   7000   345     191
      7 2007  10000   500     191

В приведенном выше примере я хочу разделить магазины на входящих, выходящих и действующих. Так, например, я хотел бы узнать, сколько магазинов ушли с рынка за период, что должно выглядеть так:

 store year   rev space  market
      2 2004 35000   800     136
      6 2006  7000   345     191

Вышли на рынок:

 store year    rev space  market
      4 2005  17500   320     136
      5 2005  45000   580     191
      7 2007  10000   500     191

И оставался действующим на протяжении всего периода:

 store year    rev  space  market
      1 2004 110000   1095     136
      1 2005 110000   1095     136
      1 2006 110000   1095     136
      1 2007 120000   1095     136     
      3 2004  45000   1000     136
      3 2005  45000   1000     136
      3 2006  45000   1000     136
      3 2007  45000   1000     136

У меня недостаточно опыта работы с R для выполнения такой задачи, поэтому буду признателен за участие.


person user3691532    schedule 03.02.2015    source источник


Ответы (1)


Похоже, хороший повод использовать data.table:

library(data.table)
setDT(dat)

dat[, if(!max(dat$year) %in% year) tail(.SD,1) , by=store]

#   store year   rev space market
#1:     2 2004 35000   800    136
#2:     6 2006  7000   345    191


dat[, if(!min(dat$year) %in% year) head(.SD,1) , by=store]

#   store year   rev space market
#1:     4 2005 17500   320    136
#2:     5 2005 45000   580    191
#3:     7 2007 10000   500    191

dat[, if(min(dat$year) %in% year & max(dat$year) %in% year) .SD , by=store]

#   store year    rev space market
#1:     1 2004 110000  1095    136
#2:     1 2005 110000  1095    136
#3:     1 2006 110000  1095    136
#4:     1 2007 120000  1095    136
#5:     3 2004  45000  1000    136
#6:     3 2005  45000  1000    136
#7:     3 2006  45000  1000    136
#8:     3 2007  45000  1000    136
person thelatemail    schedule 03.02.2015