R - unlist вложенный список дат - PullRequest
0 голосов
/ 07 мая 2018

У меня есть вложенный список дат ниже. Мне нужно отменить список, а затем получить уникальный список дат, начиная с самой ранней даты до самой последней даты.

> str(datetemp)
List of 3
 $ FCX : Date[1:5747], format: "1995-07-10" "1995-07-11" "1995-07-12" "1995-07-13" ...
 $ MAT : Date[1:9164], format: "1982-01-04" "1982-01-05" "1982-01-06" "1982-01-07" ...
 $ MSFT: Date[1:8104], format: "1986-03-13" "1986-03-14" "1986-03-17" "1986-03-18" ...

В приведенном ниже списке отсутствует класс даты и возвращается список чисел.

datetemp <- sort(unique(unlist(datetemp)))

Я погуглил и прочитал, что unlist уберет класс даты и вернется в числовом виде, а некоторые примеры показывают do.call в списке дат.

Я новичок в R и буду признателен, если кто-нибудь покажет мне, как я могу применить do.call к вложенному списку, чтобы получить требуемый вывод.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Один из вариантов - принудительно вернуться к классу 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"
0 голосов
/ 08 мая 2018

Вы можете сгладить список с помощью do.call(c, ...), сохраняя при этом тип даты.

ll <- lapply(7:9, function(x) as.Date(sample(7000:7020, x), origin="1970-01-01"))

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