Использование Times в факторе для создания пользовательского столбца - PullRequest
1 голос
/ 25 марта 2020

У меня есть набор данных с названием nypd, в котором есть столбец с именем OCCUR_TIME. Этот столбец содержит различное время (ex: 3:57:00, 10:31:00, 22:15:00, etc.).

Я хотел бы создать пользовательский столбец TIME_OF_DAY, используя R; Я написал этот код ниже:

nypd$TIME_OF_DAY <- 'Night'
nypd[nypd$OCCUR_TIME >=  6:00:00 & nypd$OCCUR_TIME < 12:00:00,] <- 'Morning'
nypd[nypd$OCCUR_TIME >= 12:00:00 & nypd$OCCUR_TIME < 16:00:00,] <- 'Afternoon'
nypd[nypd$OCCUR_TIME >= 16:00:00 & nypd$OCCUR_TIME < 20:00:00,] <- 'Evening'

Я получаю ошибку: Error in `[<-.data.frame`(`*tmp*`, nypd$OCCUR_TIME >= "6:00:00" & nypd$OCCUR_TIME < : missing values are not allowed in subscripted assignments of data frames.

Я новичок в R, поэтому я не слишком знаком с коды ошибок, но я думаю, что ошибка связана с тем, что мои значения в столбце OCCUR_TIME не читаются как значения типа «время», поэтому я не могу использовать никакие операторы.

Может кто-нибудь помочь мне понять, где я иду не так? Спасибо!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Во-первых, как говорится в ошибке, в ваших данных отсутствуют значения. Поскольку у нас нет ваших данных для работы, давайте составим некоторые данные для использования:

> data(iris)
> iris$Petal.Length[3:5] <- NA
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2           NA         0.2  setosa
4          4.6         3.1           NA         0.2  setosa
5          5.0         3.6           NA         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Теперь, у него есть проблема с поднабором на Petal.Length, потому что он не уверен, что делать когда пропущены значения.

> iris[iris$Petal.Length > 1.2 & iris$Petal.Length < 1.5, ] <- 50
Error in `[<-.data.frame`(`*tmp*`, iris$Petal.Length > 1.2 & iris$Petal.Length <  : 
                            missing values are not allowed in subscripted assignments of data frames

Также обратите внимание, что когда вы делаете это:

nypd[nypd$OCCUR_TIME >=  6:00:00 & nypd$OCCUR_TIME < 12:00:00,] <- 'Morning'

Вы не сообщаете, какой переменной вы хотите присвоить 'Morning' для!

Вы можете добавить тест для is.na к своему логическому значению и включить имя переменной, на которую хотите повлиять:

> iris[!is.na(iris$Petal.Length) & iris$Petal.Length > 1.2 & iris$Petal.Length < 1.5, 'Petal.Length'] <- 50
> head(iris)                              
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5         50.0         0.2  setosa
2          4.9         3.0         50.0         0.2  setosa
3          4.7         3.2           NA         0.2  setosa
4          4.6         3.1           NA         0.2  setosa
5          5.0         3.6           NA         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Советы по обучению работе с датами и временем в R верно, то, как вы их здесь выражаете, неверно. Если они считываются как фактор, то, возможно, однако, что вы читаете свои данные, вам нужно добавить stringsAsFactors = FALSE?

0 голосов
/ 25 марта 2020

Мы могли бы преобразовать 'OCCUR_TIME' в класс Time с as.ITime из data.table, а затем выполнить сравнение

library(dplyr)
library(data.table)
nypd %>%
    mutate(OCCUR_TIME = as.ITime(OCCUR_TIME),
           TIME_OF_DAY = case_when(between(OCCUR_TIME, as.ITime("06:00:00"),
               as.ITime("12:00:00")) ~ "Morning",
            between(OCCUR_TIME, as.ITime("12:00:00"),
               as.ITime("16:00:00")) ~ "Afternoon",
            between(OCCUR_TIME, as.ITime("16:00:00"),
               as.ITime("20:00:00")) ~ "Evening", TRUE ~ "Night"))
#  OCCUR_TIME TIME_OF_DAY
#1   05:22:34       Night
#2   07:22:29     Morning
#3   12:20:05   Afternoon
#4   15:46:23   Afternoon
#5   19:32:42     Evening

data

nypd <- data.frame(OCCUR_TIME = c("05:22:34", "07:22:29", "12:20:05",
     "15:46:23", "19:32:42"), stringsAsFactors = FALSE)
...