我正在尝试将时间值设置为数据框:
ps = data.frame(t(rep(NA, 2)))
ps[1,1] = strptime('10:30:00', '%H:%M:%S')
但是我收到了错误:
provided 9 variables to replace 1 variables
因为时间值是R中的列表(?),它认为我正在尝试设置9列,而我真的只想将一列设置为该类。
我该怎样做才能正确设置?
答案 0 :(得分:9)
这是由于strptime()
成为班级"POSIXlt"
的对象的结果:
> ps = data.frame(t(rep(NA, 2)))
> ps[1,1] = strptime('10:30:00', '%H:%M:%S')
Warning message:
In `[<-.data.frame`(`*tmp*`, 1, 1, value = list(sec = 0, min = 30L, :
provided 9 variables to replace 1 variables
> strptime('10:30:00', '%H:%M:%S')
[1] "2012-03-21 10:30:00"
> class(strptime('10:30:00', '%H:%M:%S'))
[1] "POSIXlt" "POSIXt"
"POSIXlt"
对象是当时的列表表示(因此是lt
而不是类名中的ct
):
> foo <- strptime('10:30:00', '%H:%M:%S')
> str(foo)
POSIXlt[1:1], format: "2012-03-21 10:30:00"
> unclass(foo)
$sec
[1] 0
$min
[1] 30
$hour
[1] 10
$mday
[1] 21
$mon
[1] 2
$year
[1] 112
$wday
[1] 3
$yday
[1] 80
$isdst
[1] 0
"POSIXlt"
对象是长度为9的列表:
> length(unclass(foo))
[1] 9
因此警告消息,因为对象被剥离回它的组成部分/表示。您可以在不生成警告的情况下粘贴"POSIXct"
表示:
> ps[1,1] = as.POSIXct(strptime('10:30:00', '%H:%M:%S'))
> ps[1,1]
[1] 1332325800
但我们仍在丢失课程信息。不过,您可以稍后使用"POSIXct"
函数返回as.POSIXct()
表示,但您需要指定origin
参数。有关详情,请参阅?POSIXct
。
> class(ps[1,1])
[1] "numeric"
解决方案是在插入时间之前强制ps$X1
成为课程"POSIXct"
:
> ps = data.frame(t(rep(NA, 2)))
> ps <- transform(ps, X1 = as.POSIXct(X1))
> ps[1,1] <- as.POSIXct(strptime('10:30:00', '%H:%M:%S'))
> ps
X1 X2
1 2012-03-21 10:30:00 NA
> str(ps)
'data.frame': 1 obs. of 2 variables:
$ X1: POSIXct, format: "2012-03-21 10:30:00"
$ X2: logi NA
没有警告(与as.POSIXct()
一样),但保留了类信息,丢失之前。请阅读?`[.data.frame`
,特别是强制部分,其中包含一些细节;但是我认为理解这样的替代品中的强制是如何的狡猾。