преобразование Int даты в переменную даты lubridate - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть фрейм данных со столбцом дат в виде целых чисел, например 192606 192607 и т. Д. c .. Мои значения даты - это только годы и месяцы. Я хотел бы изменить эту целочисленную форму на форму даты, чтобы я мог построить их в виде график временных рядов (ggplot)

Я пытался использовать lubridate, но получаю сообщение об ошибке.

sss[,1]<-ymd(sss[,1])

РЕДАКТИРОВАТЬ:

Данные можно найти здесь: https://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html

Я работаю с 25 портфелями ios, отсортированными по размеру и количеству книг на рынке

РЕДАКТИРОВАТЬ 2:

Вот вывод моей фрейм данных. Я ценю вашу скорую помощь! Thanks

str (sss) num [1: 1122, 1: 5] 192607 192608 192609 192610 192611 ... - attr (*, "dimnames") = Список из 2 .. $: NULL .. $ : chr [1: 5] "Время" "Перехват" "Мкт" "smb" ...

Ответы [ 2 ]

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

Посмотрите, поможет ли это.
Проблема заключается в том, что эти числа должны рассматриваться не как числа, а как строки символов, кодирующие даты в формате "YYYYMM". Таким образом, чтобы привести к классу R "Date", сначала вставьте день 01, а затем введите as.Date.

sss <- matrix(
  c(192607, 192608, 192609, 192610, 192611, 192612, 192701, 192702, 
    192703, 192704, 192705, 192706, 192707, 192708, 192709, 192710, 
    192711, 192712, 192801, 192802, 192803, 192804, 192805, 192806, 
    192807), 
  ncol = 1)

d <- as.Date(paste0(sss[, 1], "01"), format = "%Y%m%d")
head(d)
#[1] "1926-07-01" "1926-08-01" "1926-09-01" "1926-10-01" "1926-11-01"
#[6] "1926-12-01"
0 голосов
/ 12 апреля 2020

ymd требует, чтобы это был символьный вектор с порядком дат следующего года, месяца, дня в любом формате, если дата находится в этом порядке. Ваш столбец имеет тип integer и поэтому нарушает эти правила. Поэтому используйте либо as.Date() из базы, либо as_date() из lubridate

as.Date(192606)
"2497-05-03"
lubridate::as_date(192606)
"2497-05-03"

Поэтому для ваших данных:

sss[,1] <- as_date(sss[,1])

Если данные не являются цифрами c:

sss[,1] <- as_date(as.numeric(sss[,1]))

Поскольку формат YearMonth, мы можем использовать:

library(zoo)
sss[,1] <-  as.yearmon(as.character(sss[,1, drop = T]), "%Y%m")

head(sss[,1])
# A tibble: 6 x 1
  Date     
  <yearmon>
1 Jul 1926 
2 Aug 1926 
3 Sep 1926 
4 Oct 1926 
5 Nov 1926 
6 Dec 1926 

Если sss - матрица, оберните as.character() вокруг вызова as.yearmon. Это связано с тем, что для матрицы все данные должны быть одинаковыми. Когда типы смешаны, все данные преобразуются в факторы. Вот почему вы получаете значения, которые вы делаете. Поэтому преобразуйте столбец в символ, прежде чем данные приведут к фактору.

sss[,1] <- as.character(as.yearmon(as.character(test[,1]), "%Y%m"))

Хотя это работает, вам, вероятно, следует придерживаться фреймов данных при работе с такими данными.

...