【问题标题】:R checking if the same numbers occur in multiple rows of a data frameR检查数据帧的多行中是否出现相同的数字
【发布时间】:2016-11-16 00:17:06
【问题描述】:

我有一个数据框nearest_neighbour,它列出了一个点的最近邻居。所以对于点 1,第一个最近的邻居是点 2,第二个最近的邻居是点 3,以此类推。

循环并检查 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 语句。

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用factorapply 的基本R 方法

    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)的数据框的修改版本的每一行。

    【讨论】:

      【解决方案2】:

      这也是一个基本的 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 次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-04
        • 1970-01-01
        • 2021-01-30
        • 2022-12-12
        • 2014-03-27
        • 2022-12-18
        相关资源
        最近更新 更多