问题描述
我有一个数据框架,其中包含26年期间(1993年至2019年)每个月的数据,总共有312行。 不幸的是,我不得不滞后于数据,所以每年的时间现在是从7月t到6月t + 1。所以我不能只是从日期中提取年份。
现在,我想在单独的数据框中排除每年的12个月数据。我的第一个想法是将年份插入第一列,然后使用lapply函数进行过滤。
为此,我创建了以下循环:
n <- 1
m <- 1993
for (a in 1:26) {
for (i in n:(n+11)) {
t.monthly.ret.lag[i,1] <- m
}
n <- n+1
m <- m+1
}
不幸的是,R不是以12为步长来命名年份,而是以1为步长直接计数。
解决方法
您可以使用rep()
和seq()
创建一个长度为312个元素的向量,给出年份(一个给出月份)。然后,您可以将它们作为附加列附加到data.frame或仅将它们用作月份和年份的参考。
month = rep(seq(1:12),27)
year = c(matrix(rep(seq(1:27),12),ncol=27,byrow=T)+1992)
month = month[7:(length(month)-6)]
year = year[7:(length(year)-6)]
月份向量从1到12,从6开始计数,年份向量将年份重复12次(第一次和最后一次仅重复6次)。
,y.first <- 1993
y.last <- 2019
month.col <- rep(c(7:12,1:6),y.last-y.first+1)
year.col <- rep(c(y.first:y.last),each=length(month.name))
df <- data.frame(year=year.col,month=month.col)
这会产生一个带有相应标记的月份和年份的数据框,从而进一步允许使用dplyr::group_by()
,依此类推。