Очистка данных: хранение данных, имеющих по меньшей мере n последовательных наблюдений

#r #date #tidyverse #data-cleaning #panel-data

#r #Дата #tidyverse #очистка данных #панель-данные

Вопрос:

Эй, ребята, мне нужна помощь с очисткой моих данных, я все еще новичок в R, поэтому, пожалуйста, будьте полегче со мной.

Я опубликовал образец данных ниже.

  • Это набор данных панели, в котором рассматривается цена компании с течением времени (столбец значения)
  • Название компании находится в столбце cik

Проблема в том, что у меня нет полных данных по каждой отдельной компании за весь период, у некоторых компаний вообще нет никаких данных за весь период, и в результате их значение будет равно NA для всех дат, однако у некоторых будут данные за определенный период, например, за 2004-2006 годы, однако у них не будет данных за весь период выборки. Я хочу сохранять данные при наличии последовательных данных в течение 24 месяцев подряд или более.

Например, если у компании есть данные с 2005/01/01 по 2008/01/01, я хочу сохранить эти данные. Однако, если у компании есть данные с 2005/01/01 по 2006/01/01, я хочу исключить эти данные. В данных также будут некоторые компании, у которых произошел сбой, например, у компании могут быть данные с 2005/01/01 по 2006/01/01, а также с 2008/01/01 по 2015/01/01, и в этом случае я хочу сохранить данные с 2008/01/01 по 2015/01/01, но исключить данные с 2005/01/01 по 2006/01/01.

 cik     value   date
<dbl>   <dbl>   <date>
1001039 41.500  2004-10-31      
1001039 26.000  2004-11-30      
1001039 24.500  2004-12-31      
1001039 31.250  2005-01-31      
1001039 24.090  2005-02-28      
1001039 30.250  2005-03-31      
1001039 35.340  2005-04-30      
1001039 38.500  2005-05-31      
1001039 30.000  2005-06-30      
1001039 27.250  2005-07-31      
1001039 34.500  2005-08-31      
1001039 37.500  2005-09-30      
1001039 43.750  2005-10-31      
1001039 40.120  2005-11-30      
1001039 33.250  2005-12-31      
1001039 29.000  2006-01-31      
1001039 23.500  2006-02-28      
1001039 21.500  2006-03-31      
1001039 17.840  2006-04-30      
1001039 21.000  2006-05-31      
1001039 18.060  2006-06-30      
1001039 19.160  2006-07-31      
1001039 18.500  2006-08-31      
1001039 17.750  2006-09-30      
1001039 15.500  2006-10-31      
1001039 12.000  2006-11-30      
1001039 11.500  2006-12-31      
1001039 9.915   2007-01-31          
104169  5.700   2007-05-31      
104169  10.000  2007-06-30      
104169  21.000  2007-07-31      
104169  22.500  2007-08-31      
104169  18.500  2007-09-30      
104169  22.500  2007-10-31      
104169  28.000  2007-11-30      
104169  26.000  2007-12-31      
104169  35.500  2008-01-31      
104169  57.200  2008-02-29      
104169  42.300  2008-03-31      
104169  30.800  2008-04-30      
104169  35.500  2008-05-31  
1001039 34.980  2017-10-31      
1001039 33.360  2017-11-30      
1001039 32.970  2017-12-31      
1001039 28.685  2018-01-31      
1001039 28.200  2018-02-28      
1001039 35.855  2018-03-31      
1001039 29.755  2018-04-30      
1001039 34.145  2018-05-31      
1001039 48.275  2018-06-30      
1001039 37.310  2018-07-31      
1001039 34.600  2018-08-31      
1001039 36.980  2018-09-30      
1001039 34.615  2018-10-31      
1001039 35.195  2018-11-30      
1001039 40.920  2018-12-31      
1001039 29.050  2019-01-31      
1001039 21.005  2019-02-28      
1001039 18.420  2019-03-31      
1001039 16.980  2019-04-30      
1001039 21.280  2019-05-31      
1001039 17.235  2019-06-30      
1001039 15.700  2019-07-31      
1001039 15.990  2019-08-31      
1001039 19.525  2019-09-30      
1001039 19.500  2019-10-31      
1001039 16.885  2019-11-30      
1001039 15.940  2019-12-31      
1001039 18.770  2020-01-31      
1001039 28.650  2020-02-29      
1001039 59.405  2020-03-31      
1001039 36.265  2020-04-30      
1001039 26.345  2020-05-31      
1001039 23.960  2020-06-30      
1001039 22.195  2020-07-31      
100885  40.010  2004-10-31      
100885  26.500  2004-11-30      
100885  30.000  2004-12-31
100885  70.200  2008-03-31      
100885  40.300  2008-04-30      
100885  51.500  2008-05-31      
100885  72.500  2008-06-30      
100885  55.600  2008-07-31      
100885  66.000  2008-08-31      
100885  54.200  2008-09-30      
100885  85.500  2008-10-31      
100885  140.000 2008-11-30      
100885  100.000 2008-12-31      
100885  104.100 2009-01-31      
100885  101.090 2009-02-28      
100885  86.960  2009-03-31      
100885  63.850  2009-04-30      
100885  50.500  2009-05-31      
100885  57.160  2009-06-30      
100885  38.000  2009-07-31      
100885  48.500  2009-08-31      
100885  44.250  2009-09-30      
100885  59.790  2009-10-31      
100885  70.130  2009-11-30      
100885  45.420  2009-12-31      
100885  59.290  2010-01-31      
100885  58.980  2010-02-28      
100885  58.500  2010-03-31      
100885  52.250  2010-04-30      
100885  54.360  2010-05-31      
100885  50.500  2010-06-30      
100885  41.870  2010-07-31      
  

Большое всем спасибо!

Ответ №1:

Вы можете создавать группы, в которых месячная последовательность прерывается (разница между последовательными date периодами превышает 31 день), и выбирать только те группы, в которых зарегистрировано по крайней мере 24 входа (2 года).

 library(dplyr)
df %>%
  arrange(cik, date) %>%
  group_by(cik, grp = cumsum(c(TRUE, diff(date)) > 31)) %>%
  filter(n() >= 24)