运行带有数据子集的For循环,每个循环具有新的日期范围

时间:2019-01-17 18:43:03

标签: r for-loop tidyr

所以我有一组日期和对应的值,我想通过for循环运行。挑战在于,每次for循环运行时,我都想定义一组新的日期。这是为了测试前导和滞后变量。假设数据看起来像这样:

Date       Y      X
2000 Q1    100    1.5
2000 Q2    50     2
2000 Q3    75     -1
2000 Q4    25     0
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1
2001 Q4    80     2
2002 Q1    0      0
2002 Q2    0      1
2002 Q3    500    1
2002 Q4    0      0

现在我该如何编写一个for循环,该循环将每次选择一个新的日期范围,以便使Y与X回归?我想象的样子是:

for(i in (range of dates)){
    test <- data %>% filter(Date > min(range of dates) &
                            Date < max(range of dates)
    lm(Y~X, test)}

for循环选择的数据样本如下所示:

Date       Y      X
2000 Q1    100    1.5
2000 Q2    50     2
2000 Q3    75     -1
2000 Q4    25     0
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1

下一次迭代:

Date       Y      X
2001 Q1    0      3
2001 Q2    1000   4 
2001 Q3    40     1
2001 Q4    80     2
2002 Q1    0      0
2002 Q2    0      1
2002 Q3    500    1
2002 Q4    0      0

因此,每当for循环运行时,它就省去了第一年并选择一个新的年份作为示例的结尾。

1 个答案:

答案 0 :(得分:0)

> library(tidyverse)
> df <- data.frame(
    Date = c(
      paste0('2000 Q', 1:4),
      paste0('2001 Q', 1:4),
      paste0('2002 Q', 1:4)
    ),
    Y = c(
      100, 50, 75, 25,
      0, 1000, 40, 80,
      0, 0, 500, 0
    ),
    X = c(
      1.5, 2, -1, 0,
      3, 4, 1, 2,
      0, 1, 1, 0
    ),
    stringsAsFactors = FALSE
  )

> df
      Date    Y    X
1  2000 Q1  100  1.5
2  2000 Q2   50  2.0
3  2000 Q3   75 -1.0
4  2000 Q4   25  0.0
5  2001 Q1    0  3.0
6  2001 Q2 1000  4.0
7  2001 Q3   40  1.0
8  2001 Q4   80  2.0
9  2002 Q1    0  0.0
10 2002 Q2    0  1.0
11 2002 Q3  500  1.0
12 2002 Q4    0  0.0

> year_range <- df %>% transmute(
    years = str_sub(
      Date, start = 1L, end = 4L
    )
  ) %>% unique() %>% pull() # Extract unique years

> for (cur_year in 1:(length(year_range) - 1)) {

    test <- df %>% filter(
      str_sub(
        Date, start = 1L, end = 4L
      ) %in% c(
        year_range[cur_year],
        year_range[cur_year + 1]
      )
    )

    print(
      lm(
        formula = Y ~ X, 
        data = test
      )
    )

  }

以上lm所覆盖的年份2000-2001然后是2001-2002的输出是

Call:
lm(formula = Y ~ X, data = test)

Coefficients:
(Intercept)            X  
     -25.78       126.10  


Call:
lm(formula = Y ~ X, data = test)

Coefficients:
(Intercept)            X  
     -40.71       162.14