2017-08-14 3 views
-3

私は与えられた株式の月間リターンを含む大きなデータセットを得ました。年間のデータがない行を削除したいと思います。データのサブセットは、一例として以下に示します。彼らは、観察の通年を持っていないので、年間のデータがない行を削除する

Date  Return Year   
9/1/2009 0.71447 2009 
10/1/2009 0.48417 2009 
11/1/2009 0.90753 2009 
12/1/2009 -0.7342 2009 
1/1/2010 0.83293 2010 
2/1/2010 0.18279 2010 
3/1/2010 0.19416 2010 
4/1/2010 0.38907 2010 
5/1/2010 0.37834 2010 
6/1/2010 0.6401 2010 
7/1/2010 0.62079 2010 
8/1/2010 0.42128 2010 
9/1/2010 0.43117 2010 
10/1/2010 0.42307 2010 
11/1/2010 -0.1994 2010 
12/1/2010 -0.2252 2010 

理想的には、コードは、最初の4つの観測を削除します。

+2

これまで手元にあったコードを用意しておくと、助けが簡単になります。 –

+4

dplyr、 'df%>%group_by(year)%>%dplyr :: mutate(count = n())%>%filter(count == 12)' – Wen

+0

@ C8H10N4O2あなたは正しいです〜 – Wen

答えて

1

OPは、1年間を構成していない大量の月データからすべての行を削除するよう要求しました。 solution suggested by Wenworking for the OPと思われますが、より堅牢なアプローチを提案したいと思います。

Wenのソリューションは、正確に月に1行があると仮定して、1年間の行数をカウントします。運用データセットに重複したエントリがある場合は、ユニーク月の数を1年に数えるとより堅牢になります。 (私の経験から、運用データを扱い、すべての前提をチェックするには十分な注意が必要です)。

library(data.table) 
# count number of unique months per year, 
# keep only complete years, omit counts 
# result is a data.table with one column Year 
full_years <- DT[, uniqueN(month(Date)), by = Year][V1 == 12L, -"V1"] 
full_years 
Year 
1: 2010 
# right join with original table, only rows belonging to a full year will be returned 
DT[full_years, on = "Year"] 
  Date Return Year 
1: 2010-01-01 0.83293 2010 
2: 2010-02-01 0.18279 2010 
3: 2010-03-01 0.19416 2010 
4: 2010-04-01 0.38907 2010 
5: 2010-05-01 0.37834 2010 
6: 2010-06-01 0.64010 2010 
7: 2010-07-01 0.62079 2010 
8: 2010-08-01 0.42128 2010 
9: 2010-09-01 0.43117 2010 
10: 2010-10-01 0.42307 2010 
11: 2010-11-01 -0.19940 2010 
12: 2010-12-01 -0.22520 2010 

このアプローチは、潜在的に大きなデータセットの各行にcount列を追加するために避けることに注意してください。例えば、

stopifnot(all(DT[, .N, by = .(Year, month(Date))]$N == 1L)) 

このコードは、のために出現回数をカウントし、重複ヶ月間のデータをチェックすることも可能である

DT[DT[, uniqueN(month(Date)), by = Year][V1 == 12L, -"V1"], on = "Year"] 

コードはより簡潔にように書くことができます。毎年、毎月、実行が中止されます。

関連する問題