这是我正在处理的数据帧的一部分。第一列代表年份,第二列代表月份,第三列代表当年该月份的观察数量。
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月,依此类推)来绘制我的模型。
答案 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)