-1

元のタイムスタンプに日付と時刻が連結された 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 が不一致として出力される理由がわかりません。このデータで十分かどうか教えてください。

4

2 に答える 2