逐行计算矩阵上限范围内的 N 次出现

counting N occurrences within a ceiling range of a matrix by-row

我想在矩阵的给定范围内逐行计算一个值,然后将这些逻辑结果相加得出"measure of consistency"对于每一行。

可重现的例子:

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 行中的 none 个值彼此相差在一个数字值内,因此每个值都分配了 FALSE.

任何指点将不胜感激?

更新:

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

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

Within the first row of m1 the first value (1) is within +/-1 of any other value in that row hence equals TRUE, and so on.

然而,

>> 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

这是一种使用数组的简洁的基础 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]))
}

哪个returns

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