Количество активных товаров в корзинах

У меня есть список элементов с двумя датами (дата начала и дата окончания) и продолжительностью в днях (дата окончания - дата начала). Я хочу разрезать их на ячейки, чтобы показать количество «активных элементов» в каждой ячейке, т.е. если дата начала ‹= дата ячейки и дата окончания> дата ячейки, элемент должен быть подсчитан в ячейке.

Item        StartDate     EndDate       Duration
Machine1    2005/01/21    2011/03/29    2258
Machine2    2004/05/12    2012/05/08    2918
Machine3    2004/10/15    2005/09/10    330
Machine4    2004/08/30    2011/08/02    2528
Machine5    2005/06/06    2010/12/03    2006
Machine6    2004/05/11    2007/03/17    1040
Machine7    2005/08/09    2011/05/30    2120
Machine8    2005/01/06    2012/06/07    2709
Machine9    2005/06/13    2008/08/28    1172
Machine10   2005/06/28    2010/04/08    1745
Machine11   2004/11/09    2007/05/14    916
Machine12   2005/05/26    2012/09/16    2670
Machine13   2004/05/28    2009/06/09    1838
Machine14   2005/01/06    2012/05/25    2696
Machine15   2005/08/20    2012/02/11    2366
Machine16   2004/08/02    2011/10/23    2638
Machine17   2004/08/10    2009/03/15    1678
Machine18   2005/05/08    2006/04/17    344
Machine19   2005/08/26    2006/07/24    332
Machine20   2004/03/30    2006/05/07    768

Подсчитывает бункер, который я хочу произвести:

2004/01/01  0
2005/01/01  9
2006/01/01  19
2007/01/01  16
2008/01/01  14
2009/01/01  13
2010/01/01  11
2011/01/01  9
2012/01/01  5
2013/01/01  0

Как видите, итоговые значения ячеек не складываются в общее количество элементов, как можно было бы ожидать от традиционной гистограммы.

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


person Francois Botha    schedule 13.11.2013    source источник


Ответы (1)


Способ:

#turn dates to actual dates
DF$StartDate <- as.Date(DF$StartDate, "%Y/%m/%d")
DF$EndDate <- as.Date(DF$EndDate, "%Y/%m/%d")
binDF[,1] <- as.Date(binDF[,1], "%Y/%m/%d")

counts <- colSums(sapply(binDF[,1], function(x) {DF$StartDate <= x & DF$EndDate > x}))
#> counts
#[1]  0  9 19 16 14 13 11  9  5  0

И как полный фрейм данных:

resDF <- data.frame(dates = binDF[,1], counts = counts, stringsAsFactors = F)
#> resDF
#        dates counts
#1  2004-01-01      0
#2  2005-01-01      9
#3  2006-01-01     19
#4  2007-01-01     16
#5  2008-01-01     14
#6  2009-01-01     13
#7  2010-01-01     11
#8  2011-01-01      9
#9  2012-01-01      5
#10 2013-01-01      0

Фреймы данных DF и binDF:

DF <- structure(list(Item = c("Machine1", "Machine2", "Machine3", "Machine4", 
"Machine5", "Machine6", "Machine7", "Machine8", "Machine9", "Machine10", 
"Machine11", "Machine12", "Machine13", "Machine14", "Machine15", 
"Machine16", "Machine17", "Machine18", "Machine19", "Machine20"
), StartDate = c("2005/01/21", "2004/05/12", "2004/10/15", "2004/08/30", 
"2005/06/06", "2004/05/11", "2005/08/09", "2005/01/06", "2005/06/13", 
"2005/06/28", "2004/11/09", "2005/05/26", "2004/05/28", "2005/01/06", 
"2005/08/20", "2004/08/02", "2004/08/10", "2005/05/08", "2005/08/26", 
"2004/03/30"), EndDate = c("2011/03/29", "2012/05/08", "2005/09/10", 
"2011/08/02", "2010/12/03", "2007/03/17", "2011/05/30", "2012/06/07", 
"2008/08/28", "2010/04/08", "2007/05/14", "2012/09/16", "2009/06/09", 
"2012/05/25", "2012/02/11", "2011/10/23", "2009/03/15", "2006/04/17", 
"2006/07/24", "2006/05/07"), Duration = c(2258L, 2918L, 330L, 
2528L, 2006L, 1040L, 2120L, 2709L, 1172L, 1745L, 916L, 2670L, 
1838L, 2696L, 2366L, 2638L, 1678L, 344L, 332L, 768L)), .Names = c("Item", 
"StartDate", "EndDate", "Duration"), class = "data.frame", row.names = c(NA, 
-20L))

binDF <- structure(list(V1 = c("2004/01/01", "2005/01/01", "2006/01/01", 
"2007/01/01", "2008/01/01", "2009/01/01", "2010/01/01", "2011/01/01", 
"2012/01/01", "2013/01/01"), V2 = c(0L, 9L, 19L, 16L, 14L, 13L, 
11L, 9L, 5L, 0L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-10L))
person alexis_laz    schedule 13.11.2013
comment
Спасибо. Это именно то, что я ищу. - person Francois Botha; 21.11.2013
comment
@FrancoisBotha, пожалуйста, не забывайте, что вы можете отметить ответ как принятый, если ваша проблема уже решена. Вы можете сделать это, нажав на галочку рядом с ответом, чтобы переключить его с пустого на зеленый. Если у вас есть какие-либо сомнения, см. Справочный центр ›Спрашивать! - person fedorqui 'SO stop harming'; 16.04.2014