我有一列时间,其值从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形式出现?
这是日期时间数据,我该如何使用这些?每小时都有一个日期时间。
答案 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"))
编辑以下评论。
如果您从字符串中抽出时间,最佳解决方案是使用strftime
和strptime
的组合。通过这种方式,您还可以将时间格式设置为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"