Гипотетический кадр данных, представляющий стадо овец с чипами rfid на их воротниках. Существуют сборщики данных с модемами, прикрепленными к полюсам по всему полю. Каждое уникальное время, когда уникальная овца попадает в зону действия одного из этих полюсов, она считается «событием», которое хранится в устройстве arduino, прикрепленном к модему на полюсе. Каждое устройство arduino имеет адрес и примерно каждые пять минут, он вызывает через модем, чтобы сообщить о его статусе и количестве событий.R подмножество данных по дате и часу; для цикла или sapply()?
> head(wow)
address checkin_time status_id number_events
1 11 2016-08-08 00:04:40 7 10
2 11 2016-08-08 00:09:53 7 13
3 11 2016-08-08 00:15:06 7 12
4 11 2016-08-08 00:20:20 7 11
5 11 2016-08-08 00:25:33 7 13
6 11 2016-08-08 00:30:45 7 5
Я пытаюсь создать новую матрицу, которая содержит все уникальные даты как строки, и каждый уникальный час в течение дня, как и столбцы, и их суммируют общее количество событий для этой даты и времени.
Вот мой мой (усеченный) код, который делает это:
allDays <- unique(as.Date(wow$checkin_time))
for (d in allDays) {
oneAM <- subset(wow, as.POSIXct(wow$checkin_time) >= as.POSIXct(paste(d,'00:00:00')) & as.POSIXct(wow$checkin_time) <= as.POSIXct(paste(d, '00:59:59')))
twoAM <- subset(wow, as.POSIXct(wow$checkin_time) >= as.POSIXct(paste(d,'01:00:00')) & as.POSIXct(wow$checkin_time) <= as.POSIXct(paste(d, '01:59:59')))
threeAM <- subset(wow, as.POSIXct(wow$checkin_time) >= as.POSIXct(paste(d,'02:00:00')) & as.POSIXct(wow$checkin_time) <= as.POSIXct(paste(d, '02:59:59')))
enter code here
. . .
elevenPM <- subset(wow, as.POSIXct(wow$checkin_time) >= as.POSIXct(paste(d,'22:00:00')) & as.POSIXct(wow$checkin_time) <= as.POSIXct(paste(d, '22:59:59')))
twelvePM <- subset(wow, as.POSIXct(wow$checkin_time) >= as.POSIXct(paste(d,'23:00:00')) & as.POSIXct(wow$checkin_time) <= as.POSIXct(paste(d, '23:59:59')))
dayAsHours <- c(sum(oneAM$number_events), sum(twoAM$number_events), sum(threeAM$number_events), sum(fourAM$number_events), sum(fiveAM$number_events), sum(sixAM$number_events),
sum(sevenAM$number_events), sum(eightAM$number_events), sum(nineAM$number_events), sum(tenAM$number_events), sum(elevenAM$number_events),
sum(twelveAM$number_events), sum(onePM$number_events), sum(twoPM$number_events), sum(threePM$number_events), sum(fourPM$number_events),
sum(fivePM$number_events), sum(sixPM$number_events), sum(sevenPM$number_events), sum(eightPM$number_events), sum(ninePM$number_events),
sum(tenPM$number_events), sum(elevenPM$number_events), sum(twelvePM$number_events))
dateMatrix <- rbind(dateMatrix, dayAsHours)
}
Приведенный выше код работает для одного значения d
, когда это было жестко закодированы в, но перестал работать, когда я окружил его в for-loop.
Ошибки я получаю:
Error in as.POSIXlt.character(x, tz, ...) :
character string is not in a standard unambiguous format
Кроме того, я знаю, что, вероятно, следует использовать sapply()
вместо for-loop
здесь, но я с трудом выяснить, как построить функцию. Будет ли wow
быть ресурсом данных, к которому будет применена функция, или это будет allDays
?
Любая точка в правильном направлении была бы чрезвычайно полезна.
'cut' будет работать на данном POSIXt, так что вы могли бы создайте две переменные: одну с датой, а затем другую с временными интервалами, сокращенными по часам, и используйте ** data.table ** или ** dplyr ** для объединения с этими двумя, а затем измените форму перемещения по часовой стрелке на колонны. – joran