2016-11-15 78 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倍。

相关问题