2016-09-15 24 views
0

誰もが私にこのことを援助できることを願っています。私はブランチを測定しています。私はdf.ref(参照)とdf.tst(モデル化)という2つのデータセットを持っています。この参照には、各ブランチの幅と長さの値を持つ3つのブランチdf.ref$IDがあると記載されています。最も近い値を持つ2つのデータフレームの行を一致させる

df.ref <- data.frame(ID=c(1,2,3)) 
df.ref$length <- c(1.3,1.8,2.3) 
df.ref$width <- c(0.5,0.7,0.9) 
df.ref 

df.tstは、同じ3本の枝のモデル化された測定値を含みます。しかし、長さと幅の値を持つ6つのdf.tst$IDもあります。

df.tst <- data.frame(ID=c(1,2,3,4,5,6)) 
df.tst$length <- c(1.1,1.5,1.8,1.8,2.1,2.6) 
df.tst$width <- c(0.6,0.6,0.7,0.9,0.8,1.0) 
df.tst 

Iが閾値内に長さと幅の値を使用して(例えば0.2)を参照するようにモデル化から最も近い値と一致したいです。結果は次のようになります。

results <- data.frame(ID.ref=c(1,2,3)) 
results$ID.tst.match <- c(1,3,5) 
results 

私はfind.matchesを使用しようとしましたが、期待通りの結果が得られませんでした。また、RMSEを使用して各行の最小RMSEを確認し、反復することも考えましたが、より洗練されたソリューションが必要です。

また、解決策がない(しきい値を超えている)場合もあります。 ありがとうございます!使用することができ

+0

こんにちは。 'df.ref'のどの行にも最も近い' df.tst'の行を探しています。 row1は、refの値に最も近い値(diffによる)で、threshold2のrow2よりも大きい。 – ChinoLau

答えて

0

一つのアプローチは、dist関数を使用してデータポイント間の全ての対のユークリッド距離を測定することであろう。

> dist_mat <- as.matrix(dist(combined[,c('length', 'width')])) 
> dist_mat 
      1   2   3   4   5   6   7   8   9 
1 0.0000000 0.4000000 0.7071068 0.7615773 1.0198039 1.5524175 0.2236068 0.7071068 1.2369317 
2 0.4000000 0.0000000 0.3162278 0.4242641 0.6324555 1.1704700 0.2236068 0.3162278 0.8544004 
3 0.7071068 0.3162278 0.0000000 0.2000000 0.3162278 0.8544004 0.5385165 0.0000000 0.5385165 
4 0.7615773 0.4242641 0.2000000 0.0000000 0.3162278 0.8062258 0.6403124 0.2000000 0.5000000 
5 1.0198039 0.6324555 0.3162278 0.3162278 0.0000000 0.5385165 0.8544004 0.3162278 0.2236068 
6 1.5524175 1.1704700 0.8544004 0.8062258 0.5385165 0.0000000 1.3928388 0.8544004 0.3162278 
7 0.2236068 0.2236068 0.5385165 0.6403124 0.8544004 1.3928388 0.0000000 0.5385165 1.0770330 
8 0.7071068 0.3162278 0.0000000 0.2000000 0.3162278 0.8544004 0.5385165 0.0000000 0.5385165 
9 1.2369317 0.8544004 0.5385165 0.5000000 0.2236068 0.3162278 1.0770330 0.5385165 0.0000000 

これは、データフレーム内のデータフレームの比較を横切っての両方を含むので、あなたが抽出できます異なるデータフレーム内の要素間のみ距離:

> type_ind <- combined$type == 'test' 
> type_ind 
[1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE 
> cross_comparisons <- dist_mat[type_ind, !type_ind] 
> rownames(cross_comparisons) <- df.tst$ID 
> colnames(cross_comparisons) <- df.ref$ID 
> cross_comparisons 
      1   2   3 
1 0.2236068 0.7071068 1.2369317 
2 0.2236068 0.3162278 0.8544004 
3 0.5385165 0.0000000 0.5385165 
4 0.6403124 0.2000000 0.5000000 
5 0.8544004 0.3162278 0.2236068 
6 1.3928388 0.8544004 0.3162278 

次に、3つの基準データ点のそれぞれについて、最も近い点を決定するには、単に各列の最小値を見つける:

> apply(cross_comparisons, 2, which.min) 
1 2 3 
1 3 5 

との距離は、あなたが行うことができますあなたの閾値の範囲内にあるかどうかを確認する:

> threshold <- 0.2 
> apply(cross_comparisons, 2, function(x) { any(x < threshold) }) 
    1  2  3 
FALSE TRUE FALSE 
+0

迅速な返信をありがとう! – ChinoLau

関連する問題