Установите значение времени в ячейку фрейма данных - PullRequest
4 голосов
/ 21 марта 2012

Я пытаюсь установить значение времени во фрейме данных:

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 столбцов, когда я действительно просто хочу установить один столбец для этого класса.

Что я могу сделать, чтобы сделать этот набор правильно?

1 Ответ

9 голосов
/ 21 марта 2012

Это связано с тем, что 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"

A "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

A "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`, особенно раздел Coercion , в котором есть некоторые детали;но я полагаю, как это понимание принуждения в заменах, как это сложно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...