Фильтрация данных времени из фрейма данных R - PullRequest
1 голос
/ 11 апреля 2019

Итак, у меня есть набор данных в R:

IncidentID         Time           Vehicle

 19002             4:48           Car
 19003             12:30          Motorcycle
 19004             14:00          Car
 19005             9:30           Bicycle

И я пытаюсь отфильтровать некоторые данные, так как это довольно большой набор данных. Выше приведено лишь несколько примеров данных.

Я хочу отфильтровать данные по времени , где, скажем, я хочу получить данные, где Время находится между 12 вечера до 6 вечера ( 18:00 в 24-часовом формате), следовательно, у меня будет:

IncidentID         Time         Vehicle

 19003             12:30        Motorcycle
 19004             14:00        Car

Я сделал:

incident <- read.csv("incident.csv")
afternoon_incident <- incident[which(incident$Time >= 12 && incident$Time <= 18),]

Но я получаю сообщение об ошибке:

1: In Ops.factor(web$Time, 6:0) : ‘>=’ not meaningful for factors
2: In Ops.factor(web$Time, 12:0) : ‘<=’ not meaningful for factors

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Вы можете использовать lubridate для преобразования поля Time в объект времени, а затем извлечь hour для фильтрации:

library(lubridate)
incident$Time <- hm(as.character(incident$Time))
incident[which(hour(incident$Time) >= 12 & hour(incident$Time) <= 18), ]
0 голосов
/ 11 апреля 2019

Сначала необходимо преобразовать Time в фактический объект даты-времени, используя as.POSIXct, а затем сравнить.

Если вы хотите subset на основе часа, мы можем извлечь только часть часаданные используют format и сохраняют строки, которые находятся между 12 и 18 часами.Используя базу R, мы можем сделать

df$hour <- as.numeric(format(as.POSIXct(df$Time, format = "%H:%M"), "%H"))
subset(df, hour >= 12 & hour <= 18)

#  IncidentID  Time    Vehicle hour
#2      19003 12:30 Motorcycle   12
#3      19004 14:00        Car   14

Вы можете удалить столбец hour позже, если он не нужен.


Для общего решения мы можем создать дату-времястолбец, а затем сравнить

df$datetime <- as.POSIXct(df$Time, format = "%H:%M")
subset(df, datetime >= as.POSIXct("12:30:00", format = "%T") & 
           datetime <= as.POSIXct("18:30:00", format = "%T"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...