Месяцы в целое число R - PullRequest
0 голосов
/ 28 мая 2018

Это часть фрейма данных, над которым я работаю.Первый столбец представляет год, второй месяц, а третий - число наблюдений за этот месяц того года.

2005 07    2
2005 10    4
2005 12    2
2006 01    4
2006 02    1
2006 07    2
2006 08    1
2006 10    3

У меня есть наблюдения с 2000 по 2018 год. Я хотел бы провестиЯдро регрессии на этих данных, поэтому мне нужно создать целое число континуума из вектора класса даты.Например, январь 2000 г. будет 1, январь 2001 г. будет 13, январь 2002 г. будет 25 и так далее.После этого я смогу запустить ядро.Позже мне нужно перевести это обратно (1 - январь 2000 г., 2 - февраль 2000 г. и т. Д.), Чтобы построить мою модель.

Ответы [ 3 ]

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

Просто используйте небольшую алгебру:

df$cont <- (df$year - 2000L) * 12L + df$month

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

df$year <- df$cont %/% 12 + 2000L
df$month <- df$cont %% 12 # 12 is set at 0, so fix that with next line.
df$month[df$month == 0L] <- 12L

Здесь %% является оператором модуля и %/%является целочисленным оператором деления.См. ?"%%" для объяснения этих и других арифметических операторов.

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

Можно использовать тип yearmon из пакета zoo, а затем рассчитать разницу месяцев от Jan 2001, используя разницу между типом yearmon.

library(zoo)

# +1 has been added to difference so that Jan 2001 is treated as 1
df$slNum = (as.yearmon(paste0(df$year, df$month),"%Y%m")-as.yearmon("200001","%Y%m"))*12+1

#   year month obs slNum
# 1 2005     7   2    67
# 2 2005    10   4    70
# 3 2005    12   2    72
# 4 2006     1   4    73
# 5 2006     2   1    74
# 6 2006     7   2    79
# 7 2006     8   1    80
# 8 2006    10   3    82

Данные:

df <- read.table(text = 
"year month obs
2005 07    2
2005 10    4
2005 12    2
2006 01    4
2006 02    1
2006 07    2
2006 08    1
2006 10    3",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 28 мая 2018

Что вы можете сделать, это что-то вроде следующего.Сначала создайте дату data.frame с expand.grid, чтобы у нас были все годы и месяцы с 2000 по 2018 г. 12. Затем установите это в правильном порядке и добавьте последний столбец заказа, чтобы 2000 01 начинался с 1, а 2018 - это 12.228. Если вы объедините это с вашей исходной таблицей, вы получите следующий результат.Затем вы можете удалить ненужные столбцы.А поскольку у вас есть таблица дат, вы можете вернуть столбцы года и месяца на основе столбца заказа.

dates <- expand.grid(year = seq(2000, 2018), month = seq(1, 12))
dates <- dates[order(dates$year, dates$month), ]
dates$order <- seq_along(dates$year)


merge(df, dates, by.x = c("year", "month"), by.y = c("year", "month"))

  year month obs order
1 2005    10   4    70
2 2005    12   2    72
3 2005     7   2    67
4 2006     1   4    73
5 2006    10   3    82
6 2006     2   1    74
7 2006     7   2    79
8 2006     8   1    80

data:

df <- structure(list(year = c(2005L, 2005L, 2005L, 2006L, 2006L, 2006L, 2006L, 2006L), 
                     month = c(7L, 10L, 12L, 1L, 2L, 7L, 8L, 10L), 
                     obs = c(2L, 4L, 2L, 4L, 1L, 2L, 1L, 3L)), 
                class = "data.frame", 
                row.names = c(NA, -8L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...