首页 > 解决方案 > 在因子中使用时间来创建自定义列

问题描述

我有一个标题为 的数据集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列中的值没有被读取为“时间”类型的值,所以我不能使用任何运营商。

有人可以帮我弄清楚我哪里出错了吗?谢谢!

标签: rrstudior-markdown

解决方案


首先,正如错误所说,您的数据中缺少值。由于我们没有您的数据可以使用,让我们弥补一些数据来使用:

> 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


推荐阅读