1

非常に大きなデータ フレーム (数百万レコード) があります。
次のルールにより、フィルター処理する必要があります

したがって、ID と x の 2 つの列だけに関心があります。データ フレームは ID でソートされます。
ループを使用するのはかなり簡単ですが、ループはそのような大きなデータ フレームではうまく機能しません。

「ベクタースタイル」でそれを行う方法は?

例:
フィルタリング前

ID  x  
1 0  
1 0  
1 5  # First record with x>0  
1 0  
1 3  
1 4  
1 0   
1 9   
1 0  # Delete all earlier records of that product  
1 0  
1 6  
2 0  
2 1  # First record with x>0   
2 0  
2 4  
2 5  
2 8  
2 0  # Delete all earlier records of that product  
2 1  
2 3  

フィルタリング後:

ID  x  
1 9   
1 0  
1 0  
1 6   
2 0  
2 1  
2 3  
4

1 に答える 1

4

これらの分割、適用、結合の問題については、plyrを使用するのが好きです。速度が問題になる場合は代替手段がありますが、ほとんどの場合、plyr は理解しやすく使いやすいです。上記のロジックを実装する関数をddply()作成し、ID に基づいてデータの各チャンクを操作するためにそれをフィードしました。

fun <- function(x, column, threshold, numplus){
  whichcol <- which(x[column] > threshold)[1]
  rows <- seq(from = (whichcol + numplus), to = nrow(x))
  return(x[rows,])
}

そして、これをddply()

require(plyr)
ddply(dat, "ID", fun, column = "x", threshold = 0, numplus = 5)
#-----
  ID x
1  1 9
2  1 0
3  1 0
4  1 6
5  2 0
6  2 1
7  2 3
于 2012-07-01T15:55:05.640 に答える