Подтвердить что ты не робот

Как перебирать список дат без принуждения к числовому в R?

Это связано с Зацикливание объекта datetime приводит к числовому итератору

> dates <- as.Date(c("2013-01-01", "2013-01-02"))
> class(dates)
[1] "Date"
> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

У меня есть два вопроса:

  • Каков предпочтительный способ перебора списка объектов Date?
  • Я не понимаю ответа Джошуа (принятый ответ из связанного выше вопроса), я процитирую его здесь: "Итак, ваш вектор Date принуждается к numeric, потому что объекты Date не строго векторы". Итак, как определяется, что Date следует принуждать к numeric?
4b9b3361

Ответ 1

Здесь есть две проблемы. Один из них: вводится ли вход от Date до numeric. Другим является то, будет ли результат принуждаться к numeric.

Ввод

Для циклов вставляем Date входы в numeric, потому что, как указывают @DWin и @JoshuaUlrich, петли for принимают vectors, а Date технически не являются векторами.

> for(d in dates) print(class(d))
[1] "numeric"
[1] "numeric"

С другой стороны, lapply и его потомство для упрощения sapply не имеют таких ограничений.

> sapply( dates, function(day) class(day) )
[1] "Date" "Date"

Выход

Однако! Вывод class() выше - символ. Если вы попытаетесь фактически вернуть объект даты, sapply - это не то, что вы хотите.

lapply не принуждает к вектору, но sapply делает:

> lapply( dates, identity )
[[1]]
[1] "2013-01-01"

[[2]]
[1] "2013-01-02"

> sapply( dates, identity )
[1] 15706 15707

Это потому, что функция упрощения sapply принудительно выводит на вектор.

Резюме

Итак: если у вас есть объект Date и вы хотите вернуть объект Date, вы можете использовать lapply или sapply. Если у вас есть объект Date и вы хотите вернуть объект Date, вы можете использовать цикл for или lapply. Если у вас есть объект Date и вы хотите вернуть объект Date, используйте lapply.

Ресурсы для обучения больше

Если вы хотите углубиться в векторы, вы можете начать с заметки Джона Кука, продолжить с R Inferno и продолжите с SDA.