元のタイムスタンプに日付と時刻が連結された 1 分間の太陽光発電間隔の時系列データを使用しています。sub() を使用して日付と時刻を分割し、cbind() を使用してそれらをデータフレームに追加しました。最初はすべて問題ないように見えますが、日付と時刻が元の文字列と一致することを確認する小さなエラー チェッカーを構築したいと思います。一致しない場合は、さらにトラブルシューティングするために行インデックスを返します。私の考えは、一致/不一致を識別するために grepl + which を使用することです。以下のコードは、私が何を扱っているかを示しています。
> head(data2)
dates times datetime use..kW. gen..kW. Grid..kW.
1 12/31/2013 23:58 12/31/2013 23:58 1.463883 -0.003050000 1.463883
2 12/31/2013 23:57 12/31/2013 23:57 1.940267 -0.003450000 1.940267
3 12/31/2013 23:56 12/31/2013 23:56 1.934417 -0.003466667 1.934417
4 12/31/2013 23:55 12/31/2013 23:55 1.996050 -0.003550000 1.996050
5 12/31/2013 23:54 12/31/2013 23:54 2.009883 -0.003566667 2.009883
6 12/31/2013 23:53 12/31/2013 23:53 2.009967 -0.003516667 2.009967
Solar..kW. Solar...kW.
1 -0.003050000 0
2 -0.003450000 0
3 -0.003466667 0
4 -0.003550000 0
5 -0.003566667 0
6 -0.003516667 0
> a <- grepl("23:56", data2[, 3])
> which(a == TRUE)
[1] 3 1443 2883 4323 5763 7203 8643 10083 11523
上記の which() の結果は、日時列の文字列に「23:56」を含むすべての行に対応します。スペースを節約するために、戻りベクトルの 1 行だけをコピーしました...
私のチェッカーでは、偽のケースを特定したいことはわかっています。今のところ、説明のために TRUE を使用しています。私が抱えている問題は、grepl() で複数の文字列を使用することに関連しています。これは、1 つの時間値だけでなく、データフレーム内のすべての行に対して実行したいからです。grepl で mapply を使用しようとしましたが、データフレームには 478,933 の観測があるため、時間がかかりました。mapply + grepl は次のようになります。
mapply(grepl, data2$dates, data2$datetime)
観測範囲 (200) だけで同じ mapply 関数を使用しました。これがTRUEに設定されている場合、200行のインデックスを取得し、FALSEを使用するとinteger(0)を取得します-これは、データが正確であることを意味するため、これはすべて不要である可能性があることを理解しています...しかし、今、私は問題に投資していますより多くの学習/演習の観点があり、将来、より大きなデータセットを扱う際に役立ちます。
長い質問で申し訳ありません。ご提案いただきありがとうございます。
パート2:
再現可能なデータを提供できなかったことをお詫び申し上げます。データが大きすぎて、データフレーム全体を SO に投稿できません。また、@ G.Grothendieck、tapply または split を使用して各時間間隔のサンプリング分布を取得するため、日時文字列を分割しています。つまり、1 日の各分に対応する 1,440 個の「バケット」があります。各バケットは、1 年全体からのその時間間隔での観測によって満たされます。
これは、data2 の先頭である新しいバージョン (data3) です。data3[3,2] の値を「23:57」に変更しました。これは、datatime 列の時間と一致しないため、これを使用して両方のソリューションをテストできます。Justin's が最初で、G.Grothendieck がそれに続きます。
> data3 <- head(data2)
> data3[3,2] <- "23:57"
> data3
dates times datetime use..kW. gen..kW. Grid..kW. Solar..kW.
1 12/31/2013 23:58 12/31/2013 23:58 1.463883 -0.003050000 1.463883 -0.003050000
2 12/31/2013 23:57 12/31/2013 23:57 1.940267 -0.003450000 1.940267 -0.003450000
3 12/31/2013 23:57 12/31/2013 23:56 1.934417 -0.003466667 1.934417 -0.003466667
4 12/31/2013 23:55 12/31/2013 23:55 1.996050 -0.003550000 1.996050 -0.003550000
5 12/31/2013 23:54 12/31/2013 23:54 2.009883 -0.003566667 2.009883 -0.003566667
6 12/31/2013 23:53 12/31/2013 23:53 2.009967 -0.003516667 2.009967 -0.003516667
Solar...kW.
1 0
2 0
3 0
4 0
5 0
6 0
> all(paste(data3$dates, data3$times) == data3$datetime)
[1] FALSE
> which(paste(data3$dates, data3$times) != data3$datetime)
[1] 3
> with(data3, which(format(datetime) != paste(dates, times)))
[1] 3
したがって、どちらも同じ結果になります...ただし、データフレーム全体 (data2) で G.Grothendieck のソリューションを使用すると、行 840:24279 が不一致であるとのことでした。出力の最初の 2 行を次に示します。
> with(data2, which(format(datetime) != paste(dates, times)))
[1] 840 841 842 843 844 845 846 847 848 849 850 851
[13] 852 853 854 855 856 857 858 859 860 861 862 863
不一致の最初の 6 行を新しい df (data4) に入れました。次に、各ソリューションを再度適用しました...
> data4
dates times datetime use..kW. gen..kW. Grid..kW. Solar..kW.
840 12/31/2013 9:59 12/31/2013 9:59 4.480733 5.948300 -1.4675667 5.948300
841 12/31/2013 9:58 12/31/2013 9:58 4.503950 5.832533 -1.3285833 5.832533
842 12/31/2013 9:57 12/31/2013 9:57 4.516283 5.739600 -1.2233167 5.739600
843 12/31/2013 9:56 12/31/2013 9:56 4.906783 5.677033 -0.7702500 5.677033
844 12/31/2013 9:55 12/31/2013 9:55 5.951183 5.621617 0.3295667 5.621617
845 12/31/2013 9:54 12/31/2013 9:54 6.226417 5.596517 0.6299000 5.596517
Solar...kW.
840 5.948300
841 5.832533
842 5.739600
843 5.677033
844 5.621617
845 5.596517
> all(paste(data4$dates, data4$times) == data4$datetime)
[1] TRUE
> which(paste(data4$dates, data4$times) != data4$datetime)
integer(0)
> with(data4, which(format(datetime) != paste(dates, times)))
integer(0)
>
これは、ソリューションが同じであることを再度示していますが、データフレーム全体 (data2) で G.Grothendieck を使用すると、840:24279 が不一致として出力される理由がわかりません。このデータで十分かどうか教えてください。