Поддержание структуры при конвертации в POSIXct - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь преобразовать два столбца unix раз в фактические даты. См. Пример ниже:

df = as.matrix(data.frame(col1 = as.numeric(sample(1316006155:1316009155,10)), col2 = as.numeric(sample(1316006155:1316009155,10))))

as.POSIXct(df,origin = "1970-01-01",tz = "GMT")

Хотя вышеприведенное работает, я теряю структуру данных (т.е. создаю один большой вектор). Как мне поддерживать структуру (т.е. два столбца, каждый из которых преобразуется в POSIXct). Кроме того, я подумал, что если бы у меня было unix раз в кадре данных, я мог бы использовать следующий код применения для изменения строки за строкой (хотя я знаю, что векторизация сверху быстрее), однако это не работает. Почему?

apply(df,2,function(x) as.POSIXct(x,origin = "1970-01-01",tz = "GMT"))

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2020

Вы работаете с matrix es, но "date" классы как "POSIXct" невозможны в matrix. В частности, apply возвращает матрицы в качестве результата и, таким образом, снова приводит результат "fre sh" к цифре c. Причина в том, что matrix() использует as.vector, который на самом деле имеет аргумент mode=, но не для "date", "POSIXct", ....

Таким образом, вы можете либо привести к "character" формату:

res1 <- apply(df, 2, function(x) as.character(as.POSIXct(x,origin="1970-01-01", tz="GMT")))

Или, более эффективно:

res1 <- array(as.character(as.POSIXct(df, origin="1970-01-01", tz="GMT")), 
              dim=dim(df), dimnames=dimnames(df))
#                        col1                  col2                 
#  [1,] "2011-09-14 13:59:23" "2011-09-14 13:21:50"
#  [2,] "2011-09-14 13:55:23" "2011-09-14 13:42:59"
#  [3,] "2011-09-14 13:35:31" "2011-09-14 13:18:39"
#  [4,] "2011-09-14 13:34:12" "2011-09-14 14:00:24"
#  [5,] "2011-09-14 13:36:46" "2011-09-14 13:56:52"
#  [6,] "2011-09-14 13:26:28" "2011-09-14 13:47:37"
#  [7,] "2011-09-14 13:50:51" "2011-09-14 13:30:53"
#  [8,] "2011-09-14 13:35:06" "2011-09-14 13:25:55"
#  [9,] "2011-09-14 13:38:01" "2011-09-14 13:37:41"
# [10,] "2011-09-14 13:50:26" "2011-09-14 13:31:26"

str(res1)
# chr [1:10, 1:2] "2011-09-14 13:59:23" "2011-09-14 13:55:23" ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:2] "col1" "col2"

Или , приводит матрицу к "data.frame", что позволяет использовать lapply. A data.frame допускает "POSIXct" классы.

res2 <- as.data.frame(lapply(as.data.frame(df), function(x) 
          as.POSIXct(x, origin="1970-01-01", tz="GMT")))
#                   col1                col2
# 1  2011-09-14 13:59:23 2011-09-14 13:21:50
# 2  2011-09-14 13:55:23 2011-09-14 13:42:59
# 3  2011-09-14 13:35:31 2011-09-14 13:18:39
# 4  2011-09-14 13:34:12 2011-09-14 14:00:24
# 5  2011-09-14 13:36:46 2011-09-14 13:56:52
# 6  2011-09-14 13:26:28 2011-09-14 13:47:37
# 7  2011-09-14 13:50:51 2011-09-14 13:30:53
# 8  2011-09-14 13:35:06 2011-09-14 13:25:55
# 9  2011-09-14 13:38:01 2011-09-14 13:37:41
# 10 2011-09-14 13:50:26 2011-09-14 13:31:26

str(res2)
# 'data.frame': 10 obs. of  2 variables:
# $ col1: POSIXct, format: "2011-09-14 13:59:23" "2011-09-14 13:55:23" ...
# $ col2: POSIXct, format: "2011-09-14 13:21:50" "2011-09-14 13:42:59" ...

Данные:

df <- structure(c(1316008763, 1316008523, 1316007331, 1316007252, 1316007406, 
1316006788, 1316008251, 1316007306, 1316007481, 1316008226, 1316006510, 
1316007779, 1316006319, 1316008824, 1316008612, 1316008057, 1316007053, 
1316006755, 1316007461, 1316007086), .Dim = c(10L, 2L), .Dimnames = list(
    NULL, c("col1", "col2")))
...