2013-02-08 7 views
5

私は、ref、target、distanceという3つの列を持つデータフレームを持っています。各refには同じターゲットセットに対する測定距離があり、各refに対して最小距離のベクトルを取得したいと考えています。今私はforループでこれをやっていますが、これをベクトル化する方法があるはずです。Rフレーム内のループのためのベクトル化R

は、ここに私のコードです:

refs <- levels(data$ref) 

result <- c() 
for (ref in refs) { 
    # Find the minimum distance for observations with the current ref 
    # but be sure to protect against ref == target! 
    best_dist <- min(data[data$ref == ref & data$target != ref,]$distance) 
    result <- c(result, best_dist) 
} 

私は私のデータフレームがこのように設定するか、これをベクトル化するための良い方法があることによって運命づけられていますか?助けてくれてありがとう!

答えて

6

c,cbind,rbindを使用してループ内でオブジェクトを成長させないでください。オブジェクトは毎回コピーされます。 代わりに、正しいサイズに事前に割り当てます(結果が流動的である場合は過大評価してください)。ループはここで

Iは、メモリ効率及びコーディングエレガンスに対するdata.table Sが好き必要とされない、言われていること

​​

refとターゲットが(コメントで示唆されているように)さまざまなレベルでの因子の列である場合には、どちらかそれらが同じレベルを持っているか、私はあなたが持っていると思うの文字

DT[as.character(ref) != as.character(target), list(bestdist = min(distance)), by = ref] 
+0

に変換しますa)そこに行方不明... – adibender

+0

ta。 – mnel

+0

これはそのまま正しく動作しないようです。 Ops.factor(ref、target)のエラー:要素のレベルセットが異なる** ただし、** DT [、list(bestdist = min(distance))、by = ref] ** 出力は出力されますが、ref!= targetチェックは出力されません。 – weitzner

関連する問題