R:以12的步长细分/提取数据帧的行

问题描述

我有一个数据框架,其中包含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(),依此类推。