Один из вариантов - принудительно вернуться к классу Date после того, как unlist
сбросит его. Для этого вам нужно указать origin
, из которого рассчитываются целые числа, то есть эпоха Unix , т.е. 1970-01-01
.
datetemp <- list(FCX = structure(c(9321, 9322, 9323, 9324), class = "Date"),
MAT = structure(c(4386, 4387, 4388, 4389), class = "Date"),
MSFT = structure(c(5915, 5916, 5919, 5920), class = "Date"))
datetemp2 <- as.Date(unlist(datetemp), origin = "1970-01-01")
datetemp2
#> FCX1 FCX2 FCX3 FCX4 MAT1
#> "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" "1982-01-04"
#> MAT2 MAT3 MAT4 MSFT1 MSFT2
#> "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13" "1986-03-14"
#> MSFT3 MSFT4
#> "1986-03-17" "1986-03-18"
Лучший подход - использовать do.call
, который объединяет список в качестве параметров вызова и оценивает его, поэтому, если вы используете do.call(c, list(1, 2))
, он фактически вызывает c(1, 2)
.
datetemp3 <- do.call(c, datetemp)
datetemp3
#> FCX1 FCX2 FCX3 FCX4 MAT1
#> "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" "1982-01-04"
#> MAT2 MAT3 MAT4 MSFT1 MSFT2
#> "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13" "1986-03-14"
#> MSFT3 MSFT4
#> "1986-03-17" "1986-03-18"
Сортировка и удаление дубликатов удаляет имена, что, вероятно, хорошо:
unique(sort(datetemp3))
#> [1] "1982-01-04" "1982-01-05" "1982-01-06" "1982-01-07" "1986-03-13"
#> [6] "1986-03-14" "1986-03-17" "1986-03-18" "1995-07-10" "1995-07-11"
#> [11] "1995-07-12" "1995-07-13"