Ошибка при использовании if_else применительно ко времени и датам

#r #if-statement

#r #if-оператор

Вопрос:

Ниже приведен пример моего набора данных, где у меня есть позиции GPS ( Latitude и Longitude ), а также дата и время, когда они были зарегистрированы:

 > head(datanet)
   Date amp; Time [Local]  Latitude Longitude
1:    18/06/2018 03:01 -2.434901  34.85359
2:    18/06/2018 03:06 -2.434598  34.85387
3:    18/06/2018 03:08 -2.434726  34.85382
4:    18/06/2018 03:12 -2.434816  34.85371
5:    18/06/2018 03:16 -2.434613  34.85372
6:    18/06/2018 03:20 -2.434511  34.85376
  

Я хотел бы создать столбец, split который будет просматривать каждую строку и показывать, Night находится ли время в первом столбце в интервале [18:00: 06:00] и Day равно ли время в первом столбце [06:00: 18:00]. Вот как я подходил к этому, хотя имейте в виду, что я новичок:

 > datanet[, DateTime := dmy_hm(`Date amp; Time [Local]`)]
> head(datanet)
   Date amp; Time [Local]  Latitude Longitude            DateTime
1:    18/06/2018 03:01 -2.434901  34.85359 2018-06-18 03:01:00
2:    18/06/2018 03:06 -2.434598  34.85387 2018-06-18 03:06:00
3:    18/06/2018 03:08 -2.434726  34.85382 2018-06-18 03:08:00
4:    18/06/2018 03:12 -2.434816  34.85371 2018-06-18 03:12:00
5:    18/06/2018 03:16 -2.434613  34.85372 2018-06-18 03:16:00
6:    18/06/2018 03:20 -2.434511  34.85376 2018-06-18 03:20:00
> datanet$split<-if_else((hour(DateTime) >= 6) amp;
                           (hour(DateTime) < 18), "Day", "Night")
Error in hour(DateTime) : object 'DateTime' not found
  

Я на правильном пути и как я могу исправить эту ошибку?

Приветствуется любой ввод

Комментарии:

1. Разве это не должно быть datanet$DateTime или использовать with(datanet, if_else((hour(DateTime), ..

Ответ №1:

Столбец ‘DateTime’ находится внутри datanet набора данных, поэтому нам нужно либо $

 datanet$split<- if_else((hour(datane$DateTime) >= 6) amp;
                      (hour(datanet$DateTime) < 18), "Day", "Night")
  

Или использовать with

 datanet$split <- with(datenet, if_else((hour(DateTime) >= 6) amp;
                     (hour(DateTime) < 18), "Day", "Night"))
  

Кроме того, учитывая, что исходные данные являются data.table , синтаксис будет

 library(data.table)
datanet[, split := if_else((hour(DateTime) >= 6) amp;
                     (hour(DateTime) < 18), "Day", "Night")]
  

Или без использования каких-либо if_else

 datanet[, split := c("Night", "Day")[1   ((hour(DateTime) >= 6) amp;
                      (hour(DateTime) < 18))]]
  

Ответ №2:

Учитывая, что ваш Local столбец является текстовым, вы должны иметь возможность просто сравнивать с временными литералами:

 datanet$split <- ifelse(datanet$Local >= '18:00' | datanet$Local <= '06:00',
    'Night', 'Day')