几个月到整数R

时间:2018-05-28 16:33:48

标签: r date

这是我正在处理的数据帧的一部分。第一列代表年份,第二列代表月份,第三列代表当年该月份的观察数量。

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月将是​​1,2001年1月将是​​13,2002年1月将是​​25,依此类推。有了它,我将能够运行内核。稍后,我需要翻译它(1将是2000年1月,2将是2000年2月,依此类推)来绘制我的模型。

3 个答案:

答案 0 :(得分:6)

只需使用一点代数:

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

这里,%%是模运算符,%/%是整数除法运算符。有关这些算法和其他算术运算符的解释,请参见?"%%"

答案 1 :(得分:5)

您可以做的是以下内容。首先使用expand.grid创建日期data.frame,以便我们拥有从2000年01月到2018年的所有年份和月份。接下来按正确的顺序排列并最后添加一个订单列,以便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

数据:

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))

答案 2 :(得分:0)

选项是使用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)