タスクが効率的に、このデータからイベントを抽出することである。R:イベントの効率的な抽出(変数が連続的に増加)
data <- structure(
list(i = c(1, 1, 1, 2, 2, 2), t = c(1, 2, 3, 1, 3, 4), x = c(1, 1, 2, 1, 2, 3)),
.Names = c("i", "t", "x"), row.names = c(NA, -6L), class = "data.frame"
)
> data
i t x
1 1 1 1
2 1 2 1
3 1 3 2
4 2 1 1
5 2 3 2
6 2 4 3
がt
は時間であり、そしてx
は選択の数である、のはi
事実を呼ぶことにしましょうi
のt
である。
イベントは、1つのファクトの選択の途切れないシーケンスです。ファクト1は、t = 1からt = 3の間ですべて選択され、合計4つの選択肢があります。しかし、事実2は、t = 1からt = 1(合計= 1)、t = 3からt = 4(合計= 5)の2つのイベントに分割されます。そのため、イベント・データ・フレームは、このように見えることになっている:
> event
i from to sum
1 1 1 3 4
2 2 1 1 1
3 2 3 4 5
このコードが必要とされているものを行います。
event <- structure(
list(i = logical(0), from = logical(0), to = logical(0), sum = logical(0)),
.Names = c("i", "from", "to", "sum"), row.names = integer(0),
class = "data.frame"
)
l <- nrow(data) # get rows of data frame
c <- 1 # set counter
d <- 1 # set initial row of data to start with
e <- 1 # set initial row of event to fill
repeat{
event[e,1] <- data[d,1] # store "i" in event data frame
event[e,2] <- data[d,2] # store "from" in event data frame
while((data[d+1,1] == data[d,1]) & (data[d+1,2] == data[d,2]+1)){
c <- c+1
d <- d+1
if(d >= l) break
}
event[e,3] <- data[d,2] # store "to" in event data frame
event[e,4] <- sum(data[(d-c+1):d,3]) # store "sum" in event data frame
c <- 1
d <- d+1
e <- e+1
}
問題は、このコードは、データからイベントを抽出するために3日かかるということです私のデータフレームは500万行を持っています。
これをより効率的にするにはどうすればよいですか?
P .:私のコードには、終了に関連する小さなバグもあります。
P.P.S:データは最初にiでソートされ、次にtでソートされます。データフレームを仮定し
あなたの最初の実装は、私の500万行のために15日ではなく150秒かかりました:)本当にありがとうございます。 2回目の実装では、私は働くことができませんでした。私は最初の行を実行し、次に "イベント< - データ[..."。コードは大丈夫ですか?私はdata.tableパッケージが好きです。 – hyco
ありがとうございます。コードをそのまま実行してください。それ以上のイベントデータを導入しないでください。 – chinsoon12
あなたのdata.table実装を確認してください。私がそれを実行すると、最後の行には何の効果もないようです。しかし、以前は、あなたのfromtoコラムは私には意味がありません。 – hyco