Итак, у меня есть данные в формате .csv, показывающие время, в течение которого конкретные пользователи входят в здание и выходят из него за несколько месяцев. Я пытаюсь использовать R для составления таблицы заполняемости здания каждые 15/30 минут для анализа.
Данные были очищены и представлены в виде большого фрейма данных ffdf
(~11 миллионов записей). Фрейм данных имеет типы numeric
и factor
(он включает строки символов и числа, которые потенциально могут пригодиться позже), а время прихода/ухода находится в столбцах, отформатированных как POSIXct
.
Если бы это был гораздо меньший набор данных, я бы сделал следующее:
- Создайте пустой файл .csv (т.е.
occupancy
) для хранения уровня занятости, со временем в качестве заголовков столбцов и датой в виде строк. - Use a for loop to iterate the following across all rows:
- Calculate total time in building (clock out - clock in time)
- Извлеките дату из записи часов, сохраните как
inDate
- Используйте
round_any
из пакетаplyr
, чтобы найти ближайший 15-минутный потолок для времени начала, сохраните какnearest15
- Найдите количество полных 15-минутных блоков, которые были заняты пользователем, через
floor(as.numeric((clockouttime - clockintime)/15))
- Добавьте 1 к соответствующему количеству блоков времени, в течение которых пользователь находился в здании, начиная с
occupancy[inDate, nearest15]
.
Однако цикл for, который перебирает 11 миллионов строк, вообще не будет эффективным.
Кто-нибудь знает, как это сделать эффективно? Я в недоумении - насколько я знаю, семейство функций apply
приведёт все данные к одному типу. Нет необходимости в конкретных командах, если вы с ними не знакомы, я просто хотел бы, чтобы кто-нибудь указал мне правильный пакет и общую идею для реализации.
В настоящее время я использую ff
для доступа к данным, но если есть лучшие пакеты, которые могут это сделать, я открыт для предложений.
Спасибо.
РЕДАКТИРОВАТЬ: вот отредактированный фрагмент кода, на который я смотрю:
user_hash, section_hash, dept_id, col_a, col_b, clockin_datetime, clockout_datetime
EEDD1DA7F38CA42A35CF3C003B,85C7,TS,1,,2013-08-08 12:52:00,2013-08-08 23:00:00
2BCB6AA1603BB4357BC0D390C9,BFA3,VS,1,,2013-08-08 12:48:00,2013-08-08 22:58:00
46D859B55C4802DF51445025C5,943B,TS,1,,2013-08-08 11:58:00,2013-08-08 16:04:00
FE4EEA83AF6EA50CA5738B5610,00B3,VT,1,,2013-08-08 19:56:00,2013-08-08 23:04:00
8DB43D322F0AEF6D2B877862C3,DB1F,TS,1,,2013-08-08 12:49:00,2013-08-08 13:03:00
4E636571D425A74CA6B5FA7909,1860,VS,1,,2013-08-08 12:21:00,2013-08-08 14:01:00
26B41FA581408BDFD747234640,FDA4,VS,1,,2013-08-08 20:38:00,2013-08-08 23:03:00
A6C3C190BFFDCB4194774C1026,45C0,VT,1,,2013-08-08 12:58:00,2013-08-08 20:03:00
938506D977353EA65DC6BB5260,1819,VT,1,,2013-08-08 12:54:00,2013-08-08 16:01:00
E82F9350DA9FFC73EE6A66A286,04C1,VT,1,,2013-08-08 08:42:00,2013-08-08 12:45:00
6B92F1AB6B3EE193430B6B2793,6C2E,TS,1,,2013-08-08 09:58:00,2013-08-08 13:03:00
2B88836D8A4CA5183AAE5D3D9A,497C,TS,2,,2013-08-08 10:35:00,2013-08-08 16:06:00
Желаемый результат, который я имею в виду, выглядит примерно так, хотя любая форма, которая показывает мне занятость в любой заданный период времени/дату, прекрасна.
date 12.00 12.15 12.30 12.45 .......
2013-08-01 1344 1632 3742 1024
2013-08-02 342 435 435 435
2013-08-03
2013-08-04
...
cut
для создания коэффициента, который делит часы прихода и ухода на 15-минутные фрагменты. Затем используйтеtable
, чтобы свести в таблицу количество входов и выходов часов в каждом интервале. Разница междуcumsum(clockins)
иcumsum(clockouts)
заключается в вашей занятости. См. второй фрагмент кода в этой статье, чтобы узнать, как использоватьlubridate
для создания вектора. с регулярной серией раз, которую вы можете использовать дляcut()
ваших данных через равные промежутки времени. - person Jthorpe   schedule 14.03.2015