【问题标题】:retrieve specific entries of a matrix based on values from a data frame根据数据框中的值检索矩阵的特定条目
【发布时间】:2014-01-24 10:22:55
【问题描述】:

我有一个表单的数据框:

my.df = data.frame(ID=c(1,2,3,4,5,6,7), STRAND=c('+','+','+','-','+','-','+'), COLLAPSE=c(0,0,1,0,1,0,0))

和另一个由 nrow(my.df) 组成的维度矩阵 nrow(mydf)。这是一个相关矩阵,但这对于讨论并不重要。

例如:

mat = matrix(rnorm(n=nrow(my.df)*nrow(my.df),mean=1,sd=1), nrow = nrow(my.df), ncol=nrow(my.df))

问题是如何仅从矩阵 mat 中检索上三角元素,使得 my.df 的值为 COLLAPSE == 0,并且属于同一链?

在这个特定示例中,我有兴趣从向量中的矩阵 mat 中检索以下条目:

mat[1,2]
mat[1,7]
mat[2,7]
mat[4,6]

逻辑如下,1,2都是同一个链,它的collapse值等于0所以应该被检索,3永远不会和任何其他行合并,因为它的collapse值= 1, 1 ,3 属于同一条链,并且折叠值 = 0,因此也应该检索,...

我可以编写一个 for 循环,但我正在寻找一种更奇妙的方法来实现这样的结果......

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用outer 的一种方法:

    首先,找到具有相同STRAND 值和COLLAPSE == 0 位置的索引:

    idx <- with(my.df, outer(STRAND, STRAND, "==") &
                  outer(COLLAPSE, COLLAPSE, Vectorize(function(x, y) !any(x, y))))
    
    #       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
    # [1,] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
    # [2,]  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
    # [3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    # [4,] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
    # [5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    # [6,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
    # [7,]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
    

    其次,将下三角形和对角线上的值设置为FALSE。创建数字索引:

    idx2 <- which(idx & upper.tri(idx), arr.ind = TRUE)
    #      row col
    # [1,]   1   2
    # [2,]   4   6
    # [3,]   1   7
    # [4,]   2   7
    

    提取值:

    mat[idx2]
    # [1] 1.72165093 0.05645659 0.74163428 3.83420241
    

    【讨论】:

      【解决方案2】:

      这是一种方法。

      # select only the 0 collapse records
      sel <- my.df$COLLAPSE==0
      
      # split the data frame by strand
      groups <- split(my.df$ID[sel], my.df$STRAND[sel])
      
      # generate all possible pairs of IDs within the same strand
      pairs <- lapply(groups, combn, 2)
      
      # subset the entries from the matrix
      lapply(pairs, function(ij) mat[t(ij)])
      

      【讨论】:

        【解决方案3】:
        df <- my.df[my.df$COLLAPSE == 0, ]
        strand <- c("+", "-")
        idx <- do.call(rbind, lapply(strand, function(strand){
          t(combn(x = df$ID[df$STRAND == strand], m = 2))
        }))
        idx
        #      [,1] [,2]
        # [1,]    1    2
        # [2,]    1    7
        # [3,]    2    7
        # [4,]    4    6
        
        mat[idx]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多