2016-11-15 3 views
0

データフレーム、nearest_neighbourがあり、ポイントの最も近い近隣をリストしています。したがって、点1については、1番目に近い点は点2であり、2番目に近い点は点3であり、以下同様である。Rデータフレームの複数の行に同じ番号があるかどうかを確認する

これをループして、4つのポイントがすべて同じ最近傍を共有するかどうかを調べる最も簡単な方法は何ですか? 例

count <- 0 
for (j in 1:length(nearest_neighbour[[1]])){ 
    if(nearest_neighbour[[1]][nearest_neighbour[[1]][j]] == j){ 
     count <- count + 1 
    } 
} 
:ポイント1の3人の最も近い隣人は、私はちょうど2つの隣人のためのif文で簡単にそれを行うことができます2の最も近い隣人は1、3、4など

which.1 which.2 which.3 
1  2  3  4 
2  1  4  3 
3  1  4  2 
4  3  1  2 
5  2  4  6 
6  7  5  2 

ている2、3、4ポイントです

しかし、この方法は2つ以上の愚かなように見えます。ここ

答えて

1

が基地R方式でfactorapply

groups <- factor(apply(cbind(df, seq_len(nrow(df))), 1, 
         function(i) paste(sort(i), collapse="_"))) 

groups 
     1  2  3  4  5  6 
1_2_3_4 1_2_3_4 1_2_3_4 1_2_3_4 2_4_5_6 2_5_6_7 
Levels: 1_2_3_4 2_4_5_6 2_5_6_7 

を使用して内側の関数は、ベクトルをソートし、下線で区切られた文字列に結果を崩壊します。この関数は、現在の行番号(要素ID)が追加されたデータフレームの修正バージョンの各行に適用されます。ここ

0

は、基地R溶液であるが、別のアプローチで:

dd <- t(apply(df, 1, function(x) table(factor(x, levels=1:max(df))))) 

colSums(dd) >= 4 

    1  2  3  4  5  6  7 
FALSE TRUE FALSE TRUE FALSE FALSE FALSE 

は、SO 2及び4以上(又は等しい)を4回表示されるポイント。

関連する問題