OPは、1年間を構成していない大量の月データからすべての行を削除するよう要求しました。 solution suggested by Wenはworking 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"]
:
コードはより簡潔にように書くことができます。毎年、毎月、実行が中止されます。
出典
2017-08-28 15:09:59
Uwe
これまで手元にあったコードを用意しておくと、助けが簡単になります。 –
dplyr、 'df%>%group_by(year)%>%dplyr :: mutate(count = n())%>%filter(count == 12)' – Wen
@ C8H10N4O2あなたは正しいです〜 – Wen