为什么R中的因子水平不一致?

时间:2015-04-08 10:07:57

标签: r datetime

我有一列时间,其值从0:00到23:00 我试图将它分解,但是发生了一些奇怪的事情。我将在下面的代码中显示。

//first I get the set of values from 0:00 to 23:00 

pain <- head(train_data$time, 24)

//then I run the factor function:
fpain <- factor(pain, levels = 0:23)

它返回:

     [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>

    Levels: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

如果我在没有指定级别的情况下运行:

  fpain <- factor(pain)

我得到以下信息:

  [1] 0:00  1:00  2:00  3:00  4:00  5:00  6:00  7:00  8:00  9:00  10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 20:00 

  [22] 21:00 22:00 23:00
 24 Levels: 0:00 1:00 10:00 11:00 12:00 13:00 14:00 15:00 16:00 17:00 18:00 19:00 2:00 20:00 21:00 22:00 23:00 3:00 4:00 ... 9:00

水平如何直接从0:00,1:00到10:00?当我指定级别时,为什么它会以NA形式出现?

这是日期时间数据,我该如何使用这些?每小时都有一个日期时间。

1 个答案:

答案 0 :(得分:1)

您假设因素是数字,而不是数字。

当你这样做时:

fpain <- factor(pain, levels = 0:23)

您要指定系数订单(0, 1, 2, 3, ...),但您的值不是0, 1, 2, ...而是0:00, 1:00, 2:00, ...,因此R返回NA,因为它无法将值与该级别相匹配你指定了。

当你这样做时

 fpain <- factor(pain)

R正确创建级别0:00, 1:00, ...并按字母顺序命令,因此您的因素确实是有序的。

如果您想强加非字母顺序,请使用

 fpain <- factor(pain, levels=paste0(0:23, ":00"))

编辑以下评论。

如果您从字符串中抽出时间,最佳解决方案是使用strftimestrptime的组合。通过这种方式,您还可以将时间格式设置为hh:mm(即前导0),这样就无需重新排序级别。

例如:

str.to.time <- strptime("9/1/2012 10:00", "%d/%m/%Y %H:%M")

此POSIX对象的结果:

"2012-01-09 10:00:00 GMT"

然后您可以使用

提取时间
strftime(str.to.time, "%H:%M")
[1] "10:00"