【问题标题】:Maximums within Portions of a Matrix in RR中矩阵部分内的最大值
【发布时间】:2018-07-01 15:15:07
【问题描述】:

我有以下矩阵:

distances   nodes
1  0.7086445 1, 2, 3
2  0.6975919 1, 2, 4
3  0.7123708 1, 3, 4
4  0.6778857 2, 1, 3
5  0.6886261 2, 1, 4
6  0.6922472 2, 3, 4
7  0.7041895 3, 1, 2
8  0.7005059 3, 1, 4
9  0.6895803 3, 2, 4
10 0.8142009 4, 1, 2
11 0.7973094 4, 1, 3
12 0.8099419 4, 2, 3

对于矩阵的每个部分,其中nodes 的第一个元素是相同的值(即三行的每个块),我想执行以下操作:如果 distances 中的三个值中的每一个为那个块大于块外矩阵中的所有其他距离,则识别块。

例如,这里第 10、11 和 12 行的 distances 都大于矩阵中不包括 10、11 和 12 的部分中的所有其他 distances,我想确定这个块(nodes 以 4 开头)。

谢谢。

【问题讨论】:

    标签: r loops matrix


    【解决方案1】:

    我确信有一个更优雅的解决方案,但我是这样做的:

    library(tidyverse)
    
    df <- data_frame(
      distances = c(0.7086445, 0.6975919, 0.7123708, 0.6778857, 0.6886261, 0.6922472,
                    0.7041895, 0.7005059, 0.6895803, 0.8142009, 0.7973094, 0.8099419),
      node1 = c(1,1,1, 2, 2, 2, 3, 3, 3, 4, 4, 4),
      node2 = c(2, 2, 3, 1, 1, 3, 1, 1, 2, 1, 1, 2),
      node3 = c(3, 4, 4, 3, 4, 4, 2, 4, 4, 2, 3, 3)
    )
    
    get_max <- function(df, node) {
      maxes <- df %>%
        filter(node1 != node)
      return(max(maxes$distances))
    }
    
    tbl <- df %>%
      group_by(node1) %>%
      summarize(min = min(distances)) %>%
      rowwise() %>%
      mutate(ex_max = get_max(df, node1)) %>%
      filter(min > ex_max)
    

    【讨论】:

      【解决方案2】:

      你可以先算出某个距离大于的距离数。例如距离数10大于等于12个距离,即最大with(dat,rowSums(outer(distances,distances,"&gt;=")))with(dat,match(distances,sort(distances))),然后将它们按nodes的第一个值分组,判断排序时chunk中的所有值是否有差1,即它们彼此跟随,即它们来自同一个chunck,并且如果该chunk包含最大值,即大于其余所有。

      dat$ind=sub("(\\d).*","\\1",dat$nodes)
      
      
      merge(subset(stack(with(dat,by(match(distances,sort(distances)),ind,
         function(x) all(diff(sort(x))==1)&any(x==nrow(dat))))),values),dat,by="ind")
       ind values distances   nodes
      1   4   TRUE 0.8142009 4, 1, 2
      2   4   TRUE 0.7973094 4, 1, 3
      3   4   TRUE 0.8099419 4, 2, 3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-24
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多