#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')