2016-11-15 30 views
0

我有一個數據框,nearest_neighbour,它列出了一個點的最近鄰居。因此,對於點1,第一個最近的鄰居是點2,第二個最近的鄰居是點3,依此類推。R檢查數據幀的多行是否出現相同的數字

什麼是最快的方式來循環這一點,並檢查4點是否都共享相同的最近鄰居?例如,第1點的三個最近的鄰居是2,3和4點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 

我可以用if語句很容易地做到這一點的只有兩個鄰國:

count <- 0 
for (j in 1:length(nearest_neighbour[[1]])){ 
    if(nearest_neighbour[[1]][nearest_neighbour[[1]][j]] == j){ 
     count <- count + 1 
    } 
} 

然而,這個方法似乎愚蠢的超過2,因爲最終有很多if語句。

回答

1

下面是使用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 

內函數對一個矢量,並將結果塌縮成用下劃線分隔的串的基礎R法。該函數應用於數據框的修改版本的每一行,其中添加了當前行號(元素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 

那麼點2和4更出現(或相等),然後4倍。

相關問題