【问题标题】:How to create a new data frame with the rows for specific dates from an already exisiting data frame?如何使用现有数据框中特定日期的行创建新数据框?
【发布时间】:2018-03-03 18:57:48
【问题描述】:

我有一个数据框,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 命令,但到目前为止我无法让它们中的任何一个工作。我也尝试搜索类似的问题,但找不到适合我确切问题的解决方案。有没有一种简单的方法来做这样的事情。

非常感谢您的每一次帮助!

【问题讨论】:

  • 看看splitcut
  • 为什么要做几个data.frames?为了发送到其他地方,或者对每个data.frame 应用一个函数?您可能需要为每个(组)您想要组合在一起的月份创建一个简单的组 ID,然后使用dplyr::group_by() 和/或split(),正如已经建议的那样到达您需要的位置。
  • 我不完全确定我必须制作几个数据框,但由于我对 R 的了解有限,这对我来说似乎是最简单的解决方案。我说我只需要在前三个月、接下来的三个月等执行此操作,但这只是一个示例。我也需要在六个月、九个月和十二个月内做同样的事情。我将从尝试简单的组 ID 开始,看看我在哪里。谢谢
  • 如果您仍想拆分多个数据框,请尝试查看this。重复?
  • @Sotos 和@Jim Leach 我试过df <- as.data.frame(split.Date(Returns, 1987-02-27, drop = TRUE)),但新的df 与旧的(返回)完全相同,只是标题有奇怪的名称。正如您可能已经猜到的那样,我对 R 很陌生,所以我可能会离开这里

标签: r sorting date


【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2021-12-09
    • 1970-01-01
    • 2022-07-07
    • 2023-01-30
    相关资源
    最近更新 更多