2017-09-19 9 views
0

私は北欧証券取引所からの毎日の観測を含むrの時系列で作業しています。私は各カンパニー(列)の月の最後の日付を保持したいだけです。私はそれがこのようになりたいです月の最後の日付を除くすべての日付の行を削除するにはどうすればよいですか?

Date   Statoil  DNB 
1987-09.16  0,21  1,2 
1987-09.17  0,22  1,3 
1987-09.18  0,15  1,1 
1987-09.21  0,16  1,5 
1987-09.22  0,27  1,7 
1987-09.23  0,28  1,9 
1987-09.24  0,30  1,6 
1987-09.25  0,32  1,7 
1987-09.28  0,29  1,8 
1987-09.29  0,33  2,1 
1987-09.30  0,34  1,9 
1987-10.01  0,37  1,8 
1987-10.02  0,38  2,1 
1987-10.05  0,34  2,3 
1987-10.06  0,28  2,4 
1987-10.07  0,27  2,1 
1987-10.08  0,25  2,2 
1987-10.09  0,21  2,1 
1987-10.12  0,31  1,9 
1987-10.13  0,31  2,1 
1987-10.14  0,32  2,3 
1987-10.15  0,37  2,5 
1987-10.16  0,41  2,6 
1987-10.19  0,51  2,8 
1987-10.20  0,62  3,1 
1987-10.21  0,59  3,1 
1987-10.22  0,58  3,5 
1987-10.23  0,61  3,6 
1987-10.26  0,62  3,7 
1987-10.27  0,63  3,9 
1987-10.28  0,57  4,0 
1987-10.29  0,54  4,1 
1987-10.30  0,64  4,1 
1987-11.02  0,66  4,2 
1987-11-03  0,67  3,9 

Date   Statoil  DNB 
1987-09.30  0,34  1,9 
1987-10.30  0,64  4,1 

は、あなたたちは持っていますか

マイデータフレームは、OSEは(数千行と列ではなく)このようになります冗長な行、つまり月の最後の日付ではない行を削除するための提案はありますか?

すべての努力は大いに感謝しています!例では

+0

「会社」列はどこですか? 'ライブラリ(data.table); .date(日付、 "%Y-%m。%d"))]。(月= %d "))、))' – akrun

+0

@akrun、私は自分自身を少し混乱させて説明したかもしれません。各社は独自のコラムを持っています(Statoilは1社、DNBはもう1社、数千のコラム/会社があります)。各社の欄の数字は、終値です(ここで使用されている数字は単なる例です)。 –

+1

月にグループ化されている場合、期待される出力に11番目の行がない理由 – akrun

答えて

3

max日の行を取得するように思えます、月と年にグループ化:

library(tidyverse) 
library(lubridate) 

tib$Date <- ymd(tib$Date) # parse .$Date to date class 

tib %>% arrange(desc(Date)) %>% # order dates last to first 
    group_by(month(Date), year(Date)) %>% 
    slice(1) 

# A tibble: 3 x 5 
# Groups: month(Date), year(Date) [3] 
Date Statoil DNB `month(Date)` `year(Date)` 
<date> <fctr> <fctr>   <dbl>  <dbl> 
1 1987-09-30 0,34 1,9    9   1987 
2 1987-10-30 0,64 4,1   10   1987 
3 1987-11-03 0,67 3,9   11   1987 
2

は、何Company列が存在しないので、私たちが「月」によってグループに必要と我々はtidyverseに同じ戦略を行うことができ

library(data.table) 
setDT(df1)[, Date := as.IDate(Date, "%Y-%m.%d")] 
df1[df1[, .I[which.max(Date)] , 
    .(month = month(Date), year = year(Date))]$V1] 
#   Date Statoil DNB 
#1: 1987-09-30 0,34 1,9 
#2: 1987-10-30 0,64 4,1 
#3: 1987-11-03 0,67 3,9 
+0

これはある程度は機能しますが、正確には私が望む方法ではありません。今私は12の日付(過去1年間の月の最後の日付)だけを取得します。私は360日(過去30年間の月の最終日)を私に与えたいと思う。このための迅速な修正はありますか? –

+0

私のコメントの後にあなたの答えを編集したかもしれないと思いますか?私がコメントする前に少なくとも私は編集に気付かなかった。とにかく、私はあなたの答えをすべて打ち破ろうとしていませんでした。あなたが私の質問に答えるために取った時間に本当に感謝していますが、ネイトの答えは働きました。それが私が最初に試したものです。したがって、それは私が受け入れることを選んだ答えです。私もあなたの答えをアップアップしました! –

+0

@VegardDyranいいえ、私はあなたのコメントの後に答えを変更しませんでした。私がログオフした後、あなたはコメントしてもらえますか?グループ分けの変数として「月」だけを使って編集しました。それから、私はあなたのコメントとは別の年を実感し、それを変更しました。とにかく問題ありません。コメントをいただきありがとうございました。 – akrun

0

あなたはXTS形式にデータセットを変換して、迅速かつ容易に機能to.period()コマンドを使用して検討する必要があります。たとえば、偽の日次時系列を作成し、各月末の最後の値をサブセット化しましょう:

library(xts) 
set.seed(78) 
date.a <-seq(as.Date("2000/10/1"), as.Date("2000/12/31"), "days") 
dat <-xts(rnorm(length(date.a)), date.a) 
dat.month.end <-to.period(dat, period='months', indexAt='lastof', OHLC=F) 

dat.month.end 
        [,1] 
2000-10-31 1.00117650 
2000-11-30 -1.15090619 
2000-12-31 0.04944459 
関連する問題