2013-03-07 5 views
5

を挿入する場所に基づいて挿入された行のエントリを決定し、前の行のID、およびTIME =前の行のTIMEエントリプラスAMT /用量と同じ、ID、および私は新しい行は以下のように、0の後に= 1最初のEVID後に従うことにしたい。挿入行の列のエントリに基づいて、それは私がこのデータを持っている

ID TIME EVID AMT DOSE 
1 10  1  100 20 
1 12  1  100 20 
1 14  1  100 20 
1 16  1  100 20 
1 17  0  100 20 
1 18  1  100 20 
1 23  2  100 20 
1 20  1  100 20 
1 22  1  100 20 
2 5  1  100 40 
2 10  1  100 40 
2 15  1  100 40 
2 17  0  100 40 
2 20  1  100 40 
2 22.5 2  100 40 
3 4  1  100 25 
3 7  1  100 25 
3 10  1  100 25 
3 11  0  100 25 
3 13  1  100 25 
3 17  2  100 25 
3 16  1  100 25 
3 19  1  100 25 

私のEVIDのインデックス作成までは

rle(as.character(EVID))$lengths 
A$Index<-unlist(sapply(rle(as.character(EVID))$lengths, seq_len), use.names = FALSE) 

このコードでは、連続しているかどうかにかかわらず、すべての1とすべての0をインデックスするave(EVID、EVID、FUN = seq_along)よりも優れています。私は新しい行をIndex = 1とIndex = 2行の間に挿入したい(最初の新しい行を手動で削除する)。

ID TIME EVID AMT DOSE Index 
1 1 10 1 100 20  1 
2 1 12 1 100 20  2 
3 1 14 1 100 20  3 
4 1 16 1 100 20  4 
5 1 17 0 100 20  1 
6 1 18 1 100 20  1 
7 1 20 1 100 20  2 
8 1 22 1 100 20  3 
9 2 5 1 100 40  4 
10 2 10 1 100 40  5 
11 2 15 1 100 40  6 
12 2 17 0 100 40  1 
13 2 20 1 100 40  1 
14 3 4 1 100 25  2 
15 3 7 1 100 25  3 
16 3 10 1 100 25  4 
17 3 11 0 100 25  1 
18 3 13 1 100 25  1 
19 3 16 1 100 25  2 
20 3 19 1 100 25  3 

たAは、新たなインデックスの列を持っています。新しい行をインデックス1と2の間、つまりこの例では行番号1,6,13、および19の後にします。

私はsolutionsに出くわしました。ここで列ベクトルを作成し、その列を定義された行番号でデータに挿入します。列エントリに基づいて行を追加し、いくつかのエントリを動的に決定するにはどうすればよいですか?

ありがとうございました!ここ

+1

data.table とソリューションです。 –

+0

@RicardoSaporta私は明確化を追加しました。ありがとう! – shirleywu

+0

probはありません。以下をご覧ください –

答えて

4

は、それはそれは、具体的に新しい行を挿入する場所を決定する方法を完全に明確ではありません、本当に(コメントのビットを持つ)コードの2行だけ

library(data.table) 
ADT <- data.table(row=1:nrow(A), A, key="ID") 

# just to give an idea of how we can Find the first 0 after the first 1, look at the output from this 
ADT[, list(row, EVID,c(NA,diff(EVID)), c(NA,diff(EVID))==1)] 

# identify afer which row to insert 
# the values you want to change, assign using the `=` 
# the values to keep, just call the variable name, no `=` sign 
newRows <- ADT[c(NA,diff(EVID))==1, list(row=row+1, ID, TIME=TIME+AMT/DOSE, EVID=2, AMT, DOSE)] 

# rbind the new rows with the original DT 
# then reverse order by EVID, and order by row. 
# After ordering, remove the first column (`row`) since it is not needed 
newA <- rbind(ADT, newRows)[order(EVID, decreasing=TRUE)][order(row)][, -1, with=FALSE] 


### Results: 

> newA 
    ID TIME EVID AMT DOSE 
1: 1 10 1 100 20 
2: 1 12 1 100 20 
3: 1 14 1 100 20 
4: 1 16 1 100 20 
5: 1 17 0 100 20 
6: 1 18 1 100 20 
7: 1 23 2 100 20 
8: 1 20 1 100 20 
9: 1 22 1 100 20 
10: 2 5 1 100 40 
11: 2 10 1 100 40 
12: 2 15 1 100 40 
13: 2 17 0 100 40 
14: 2 20 1 100 40 
15: 2 22 2 100 40 
16: 3 4 1 100 25 
17: 3 7 1 100 25 
18: 3 10 1 100 25 
19: 3 11 0 100 25 
20: 3 13 1 100 25 
21: 3 17 2 100 25 
22: 3 16 1 100 25 
23: 3 19 1 100 25 
    ID TIME EVID AMT DOSE 
+0

これは美しく動作します!どうもありがとうございます! – shirleywu

+0

問題なし、喜んで助けてください –

関連する問題