【问题标题】:counting N occurrences within a ceiling range of a matrix by-row逐行计算矩阵上限范围内的 N 次出现
【发布时间】:2016-06-16 14:55:52
【问题描述】:

我想在矩阵中逐行计算一个值在给定范围内时,然后将这些逻辑结果相加以得出每行的“一致性度量”。

可重现的例子:

m1 <- matrix(c(1,2,1,6,3,7,4,2,6,8,11,15), ncol=4, byrow = TRUE)


# expected outcome, given a range of +/-1 either side

exp.outcome<-matrix(c(TRUE,TRUE,TRUE,FALSE,
                          TRUE,FALSE,TRUE,TRUE,
                          FALSE,FALSE,FALSE,FALSE), 
                          ncol=4, byrow=TRUE)

上面我已经指出了预期的结果,如果每个值都位于该行中任何其他值的 +/- 1 范围内。

m1 的第一行内,第一个值 (1) 在该行中任何其他值的 +/-1 范围内,因此等于 TRUE,依此类推。

相比之下,m1 的第 4 行中的任何值都不在一个数字内,因此每个值都被分配为 FALSE

任何指针将不胜感激?

更新:

感谢提供的帮助,我现在可以计算满足任意大矩阵上限标准的唯一值对(使用二项式系数,k 从 n 中抽取,无需替换)。

【问题讨论】:

  • 我想m1 &lt;= 4 起作用是巧合吗?或t(apply(m1, 1, function(x) x %in% c(x + 1, x - 1)))
  • 您想测试一个值是否是 == 与任何其他值 +/- 1 或者它是否具有 &lt;= 1 与任何其他值的差异?如果是第二种,提供带小数的示例或增加范围和值以使其更清晰可能会更方便。
  • @alexis_laz 在这种情况下,它只需要等于我正在处理的排名和整数

标签: r matrix count plyr ceil


【解决方案1】:

在继续回答之前,我只是想澄清一下您在问题中所说的:

m1 的第一行内,第一个值 (1) 在任何值的 +/-1 内 该行中的其他值因此等于TRUE,依此类推。

然而,

>> m1[1,4]
[1] 6

6 不在 1 的 +/- 1 范围内,并且您的答案中有 FALSE 值作为正确结果。

解决方案

此解决方案应该可以让您获得所需的结果:

t(apply(
    X = m1,
    # Take each row from the matrix
    MARGIN = 1,
    FUN = function(x) {
        sapply(
            X = x,
            # Now go through each element of that row
            FUN = function(y) {
                # Your conditions
                y %in% c(x - 1) | y %in% c(x + 1)
            }
        )
    }
))

结果

      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE  TRUE  TRUE FALSE
[2,]  TRUE FALSE  TRUE  TRUE
[3,] FALSE FALSE FALSE FALSE

检查

对于存储为 res 的结果。

>> identical(res, exp.outcome)
[1] TRUE

【讨论】:

    【解决方案2】:

    这是一种使用数组的简洁的基本 R 方法:

    前两行设置存储可接受值的三维数组和存储所需输出的矩阵。数组的结构如下:列对应于同一列中矩阵元素的可接受值。第三维对应于矩阵的行。

    以这种方式预分配应该减少重复计算。

    # construct array of all +1/-1 values
    valueArray <- sapply(1:nrow(m1), function(i) rbind(m1[i,]-1, m1[i,], m1[i,]+1),
                         simplify="array")
    
    # get logical matrix of correct dimensions
    exp.outcome <- matrix(TRUE, nrow(m1), ncol(m1))
    
    # get desired values
    for(i in 1:nrow(m1)) {
      exp.outcome[i, ] <- sapply(1:ncol(m1), function(j) m1[i, j] %in% c(valueArray[, -j, i]))
    }
    

    返回

    exp.outcome
          [,1]  [,2]  [,3]  [,4]
    [1,]  TRUE  TRUE  TRUE FALSE
    [2,]  TRUE FALSE  TRUE  TRUE
    [3,] FALSE FALSE FALSE FALSE
    

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2020-11-08
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多