将时间值设置为数据帧单元格

Rev*_*nzo 4 r dataframe

我正在尝试将时间值设置为数据框:

ps = data.frame(t(rep(NA, 2)))
ps[1,1] = strptime('10:30:00', '%H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

provided 9 variables to replace 1 variables
Run Code Online (Sandbox Code Playgroud)

因为时间值是R中的列表(?),它认为我正在尝试设置9列,而我真的只想将一列设置为该类.

我该怎么做才能正确设置?

Rei*_*son 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"
Run Code Online (Sandbox Code Playgroud)

"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
Run Code Online (Sandbox Code Playgroud)

"POSIXlt"目的是长度为9的列表:

> length(unclass(foo))
[1] 9
Run Code Online (Sandbox Code Playgroud)

因此警告消息,因为对象被剥离回它的组成部分/表示.您可以"POSIXct"在不生成警告的情况下粘贴表示:

> ps[1,1] = as.POSIXct(strptime('10:30:00', '%H:%M:%S'))
> ps[1,1]
[1] 1332325800
Run Code Online (Sandbox Code Playgroud)

但是我们仍在丢失班级信息.不过,您可以"POSIXct"稍后使用该as.POSIXct()函数返回到表示,但您需要指定origin参数.了解?POSIXct更多.

> class(ps[1,1])
[1] "numeric"
Run Code Online (Sandbox Code Playgroud)

一个解决方案是插入时间之前强制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
Run Code Online (Sandbox Code Playgroud)

没有警告(如前所述as.POSIXct()),但也保留了类信息,在丢失之前.请阅读?`[.data.frame`,特别是有一些细节的强制部分; 但是我认为理解这样的替代品中的强制是多么棘手.