0

もう一度ごめんなさい。引き続き試してみますが、次の 1 時間以内に解決できない場合に備えて、助けが必要です。

私のデータは次のようになります。

B<-data.frame(ID=c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2),EVID=c(1,1,1,0,1,2,2,1,1,1,2,2,1,1,1),VALUE=seq(15))
B$TIME<-c(Sys.time()+6*3600*(seq_len(nrow(B))-1))

実際には時間はより変動し、各 ID には 2 の EVID が複数ある場合があります。

EVID=2 の時間間隔を 1 時間刻みで追加したいと考えていました。つまり、EVID=2 のペアごとに、2 番目の EVID=2 に 1 時間以内になるまで 1 時間を追加します。ペアで、次のようなものを取得できます:(値とIDは前の行の複製です)

   ID EVID VALUE                TIME
1   1    1     1 2013-05-31 07:51:09
2   1    1     2 2013-05-31 13:51:09
3   1    1     3 2013-05-31 19:51:09
4   1    0     4 2013-06-01 01:51:09
5   1    1     5 2013-06-01 07:51:09
6   1    2     6 2013-06-01 13:51:09
6   1    2     6 2013-06-01 14:51:09
6   1    2     6 2013-06-01 15:51:09
6   1    2     6 2013-06-01 16:51:09
6   1    2     6 2013-06-01 17:51:09
6   1    2     6 2013-06-01 18:51:09
7   1    2     7 2013-06-01 19:51:09
8   1    1     8 2013-06-02 01:51:09
9   2    1     9 2013-06-02 07:51:09
10  2    1    10 2013-06-02 13:51:09
11  2    2    11 2013-06-02 19:51:09
11  2    2    11 2013-06-02 20:51:09
11  2    2    11 2013-06-02 21:51:09
11  2    2    11 2013-06-02 22:51:09
11  2    2    11 2013-06-02 23:51:09
11  2    2    11 2013-06-02 0:51:09
12  2    2    12 2013-06-03 01:51:09
13  2    1    13 2013-06-03 07:51:09
14  2    1    14 2013-06-03 13:51:09
15  2    1    15 2013-06-03 19:51:09

以下は私のブレインストーミング/試みです:

library(data.table)
BDT <- data.table(row=1:nrow(B), B, key="ID")
BDT[,list(row,EVID,c(EVID)==2)]

attach(B)

newB<-BDT[c(EVID)==2,list(row=row+1,ID=ID,EVID=EVID,VALUE=VALUE,TIME=head(TIME+3600,-1))]
finalB<-rbind(BDT,newB)[order(EVID,decreasing=TRUE)][order(row)][,-1,with=FALSE]

ただし、これにより、各 EVID=2 に Time+1 時間の行が 1 行追加されますが、これは私が望んでいたものではありません。

次に試したのは、最初の行の後にすべての行を複製することでした。これは私が望んでいたものではありませんが、列のすべての名前を入力する手間を省けるという利点があります (約 32 あります)。

newB<-B[c(1,rep(2:nrow(B),each=2)),] 
## My wild guess -- as.numeric(head(TIME))-as.numeric(tail(TIME)))/3600 doesn't work. I know it says that from row 2 to last row, repeat each row twice
newB[c(FALSE,TRUE),"EVID"]<-2
newB[c(FALSE,TRUE),"TIME"]<-newB[c(FALSE,TRUE),"TIME"]+3600

フィードバックをお寄せいただきありがとうございます。

================================================== ===============

エディのコードは私の例でうまく機能します。これは良い表現だと思いましたが、実際のデータは取得し続けます

seq.int(...) のエラー 'by' 引数の符号が間違っています

(...)私が試していたことによって異なります

比較的大きなデータがあります。例のように ID として使用する列はデータ テーブルの中央にあります。リスト内の他の名前と一緒に ID を配置すると、小さなサンプル データからでも、R はアイテム 2 が rbind のアイテム 1 よりも n+1 列を持っていると認識します。しかし、by=ID を使用できるようにリストに含めないと、R は名前の順序が異なると文句を言います。データの先頭に重要でない列の 1 つがリストされていない場合、R は項目 2 が項目 1 と比較して n-1 列を持っていると言います!

おそらく私のエラーは、時間が正確に数時間離れていないことに起因すると思いましたが、テストの実行により、小さな違いが許容され、時間に丸めたり、整数を実行したりしても役に立たないことがわかりました。

警告を無視して、length.out を使用してみました

警告メッセージ: In .rbind.data.table(...) : Argument 2 の名前の順序が異なります。ベースとの一貫性のために、列は名前でバインドされます。または、(名前のないリストを使用して) 名前を削除すると、列が位置によって結合されます。または、use.names=FALSE を設定します。

しかし、コードは、追加が多すぎる最後を除いて、2 の間に追加されません!

私は何を間違っていますか?私はこれのために一晩中引っ張ってきました:(

元のデータを再配置すると、警告を取り除くことができます。ただし、挿入はまだデータの最後でのみ行われており、多すぎます。

4

1 に答える 1