2017-09-22 60 views
1

我有一個數據幀,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 

....等等(我有數據,大約2200。公司在過去的30年,所以我將不得不創造大量的數據幀)。

我嘗試了幾種不同的方法,都使用了iffor循環,以及subset命令,但到目前爲止我無法讓它們中的任何一個工作。我也嘗試尋找類似的問題,但找不到解決方案,適用於我的確切問題。有沒有一種簡單的方法來做這樣的事情。

非常感謝您的幫助!

+0

看看'split'和'cut' – Sotos

+0

爲什麼你想做幾個'data.frame's?爲了發送到其他地方,或者爲每個'data.frame'應用一個函數?你可能需要很長的一段時間,爲每個想要分組的組的每個(一組)月份創建一個簡單的組ID,然後使用'dplyr :: group_by()'和/或'split()'按照已經建議的那樣得到到你需要的地方。 –

+0

我不完全相信我必須製作多個數據框,但是由於我對R的知識有限,這對我來說似乎是最簡單的解決方案。我說過,我只需要在頭三個月,接下來的三個月等這樣做,但這只是一個例子。我也需要在六個月,九個月和十二個月內做同樣的事情。我將首先給出一個簡單的組ID,然後看看我的位置。謝謝 –

回答

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) 

刪除從該列表爲空dataframes可以做這樣的:

dflist <- split(df, splitter) 
dflist <- dflist[sapply(dflist, nrow) > 0] 
相關問題