如何使用已存在的数据框中的特定日期的行创建新数据框?

时间:2017-09-22 08:51:00

标签: r sorting date

我有一个数据框,Returns看起来像这样:

Date         Company            LstPrice    r
1987-02-27   NOVO NORDISK 'B'   2.29        0.031531532
1987-03-31   NOVO NORDISK 'B'   2.33        0.017467249
1987-04-30   NOVO NORDISK 'B'   2.25        -0.034334764
1987-05-29   NOVO NORDISK 'B'   2.22        -0.013333333
1987-06-30   NOVO NORDISK 'B'   2.47        0.1126126137
1987-07-31   NOVO NORDISK 'B'   2.46        -0.004048583
1987-08-31   NOVO NORDISK 'B'   1.98        -0.195121951
1987-09-30   NOVO NORDISK 'B'   1.90        -0.040404040
1987-02-27   DANSKE BANK        24.29       -0.130637079
1987-03-31   DANSKE BANK        24.97       0.027995060
1987-04-30   DANSKE BANK        25.43       0.018422107
1987-05-29   DANSKE BANK        26.19       0.029885961
1987-06-30   DANSKE BANK        26.50       0.011836579
1987-07-31   DANSKE BANK        26.57       0.002641509
1987-08-31   DANSKE BANK        28.55       0.074520135
1987-09-30   DANSKE BANK        26.25       -0.080560420

我想为不同月份创建新的数据框架。例如,我想要一个新的数据框,其中包含前三个月的观察结果,未来三个月的新数据框,等等。它们看起来像这样:

数据框,FirstThreeMonths

Date         Company            LstPrice    r
1987-02-27   NOVO NORDISK 'B'   2.29        0.031531532
1987-03-31   NOVO NORDISK 'B'   2.33        0.017467249
1987-04-30   NOVO NORDISK 'B'   2.25        -0.034334764
1987-02-27   DANSKE BANK        24.29       -0.130637079
1987-03-31   DANSKE BANK        24.97       0.027995060
1987-04-30   DANSKE BANK        25.43       0.018422107

数据框,NextThreeMonths

Date         Company            LstPrice    r
1987-05-29   NOVO NORDISK 'B'   2.22        -0.013333333
1987-06-30   NOVO NORDISK 'B'   2.47        0.1126126137
1987-07-31   NOVO NORDISK 'B'   2.46        -0.004048583
1987-05-29   DANSKE BANK        26.19       0.029885961
1987-06-30   DANSKE BANK        26.50       0.011836579
1987-07-31   DANSKE BANK        26.57       0.002641509

....等等(过去30年我有大约2200家公司的数据,因此我将不得不创建大量数据框。)

我尝试了几种不同的方式,包括使用iffor循环,以及subset命令,但到目前为止,我无法使其中任何一种工作。我也尝试过搜索类似的问题,但无法找到适合我确切问题的解决方案。有没有一种简单的方法可以做这样的事情。

非常感谢所有帮助的努力!

1 个答案:

答案 0 :(得分:1)

您需要先制作分割矢量。例如:

splitter <- cut(as.integer(format(df$Date,'%m')),
                breaks = c(0,3,6,9,12),
                labels = c('First three','Second three','Third three','Fourth three'))

dflist <- split(df, splitter)

结果:

> dflist
$`First three`
         Date        Company LstPrice           r
1  1987-02-27 NOVO NORDISK B     2.29  0.03153153
2  1987-03-31 NOVO NORDISK B     2.33  0.01746725
9  1987-02-27    DANSKE BANK    24.29 -0.13063708
10 1987-03-31    DANSKE BANK    24.97  0.02799506

$`Second three`
         Date        Company LstPrice           r
3  1987-04-30 NOVO NORDISK B     2.25 -0.03433476
4  1987-05-29 NOVO NORDISK B     2.22 -0.01333333
5  1987-06-30 NOVO NORDISK B     2.47  0.11261261
11 1987-04-30    DANSKE BANK    25.43  0.01842211
12 1987-05-29    DANSKE BANK    26.19  0.02988596
13 1987-06-30    DANSKE BANK    26.50  0.01183658

$`Third three`
         Date        Company LstPrice            r
6  1987-07-31 NOVO NORDISK B     2.46 -0.004048583
7  1987-08-31 NOVO NORDISK B     1.98 -0.195121951
8  1987-09-30 NOVO NORDISK B     1.90 -0.040404040
14 1987-07-31    DANSKE BANK    26.57  0.002641509
15 1987-08-31    DANSKE BANK    28.55  0.074520135
16 1987-09-30    DANSKE BANK    26.25 -0.080560420

$`Fourth three`
[1] Date     Company  LstPrice r       
<0 rows> (or 0-length row.names)

从该列表中删除空数据帧可以这样做:

dflist <- split(df, splitter)
dflist <- dflist[sapply(dflist, nrow) > 0]