5

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

これが私のコードです:

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)
}

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

4

1 に答える 1

6

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

そうは言っても、ここではループは必要ありません

data.tableはメモリ効率とコーディングの優雅さから s が好きです。

 library(data.table)
 DT <- data.table(data)


 DT[ref != target, list(bestdist = min(distance)), by = ref] 

ref と target が異なるレベルの因子列である場合 (コメントで提案されているように)、それらを同じレベルにするか、文字に変換します

 DT[as.character(ref) != as.character(target),  list(bestdist = min(distance)), by = ref] 
于 2013-02-08T00:54:18.280 に答える