R как превратить списки в векторы и почему список вообще - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу создать вектор дат, для которого я создал простой l oop, который добавил интересующие меня даты в вектор. Однако по какой-то причине он превращает его в список.

library(timeDate)
listOfHolidays <- c()
for (year in c(getRmetricsOptions("currentYear") ,getRmetricsOptions("currentYear") +1)) {
listOfHolidays <- c(listOfHolidays,GoodFriday(year),EasterMonday(year))}

print(listOfHolidays)
[[1]]
GMT
[1] [2020-04-10]

[[2]]
GMT
[1] [2020-04-13]

[[3]]
GMT
[1] [2021-04-02]

[[4]]
GMT
[1] [2021-04-05]

Стандартный способ превратить список в вектор - использовать для меня unlist(), однако здесь это не работает. некоторая причина. Единственный способ для меня - это замысловатая версия здесь.

tmp <- as.Date(as.data.frame(t(as.data.frame(listOfHolidays)))$V1)

Так что мои вопросы довольно основны c. 1. Почему это вдруг список. 2. Как превратить его в простой вектор более элегантным способом.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Источник проблемы состоит в том, что вы объединяете различные классы объектов, когда объединяете listOfHolidays с объектами класса timeDate. Вектор должен состоять из одного класса объектов, поэтому их объединение превращается в список, поскольку ни один из них не может быть приведен к другому. Если вы проверите methods(c), то увидите, что у класса timeDate есть собственный метод, который предназначен для создания векторов этого класса, созданных пакетом timeDate.

Чтобы избежать этого, полностью покончив с l oop и объединив apply с do.call (как в решении @thomasIsCoding):

do.call(c,
       sapply(c(getRmetricsOptions("currentYear"),
                'nextYear'=unname(getRmetricsOptions("currentYear") +1)), 
       FUN=function(x) {c(goodfriday=GoodFriday(x),easter=EasterMonday(x))}))

результат:

GMT
currentYear.goodfriday     currentYear.easter    nextYear.goodfriday        nextYear.easter 
          [2020-04-10]           [2020-04-13]           [2021-04-02]           [2021-04-05] 
1 голос
/ 06 февраля 2020

Вы можете попробовать do.call + c, как показано ниже

tmp <- do.call(c,listOfHolidays)

, например,

> tmp
GMT
[1] [2020-04-10] [2020-04-13] [2021-04-02] [2021-04-05]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...