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

时间:2016-06-16 14:55:53

标签: r matrix count plyr ceiling

我想每次在一个矩阵的行中给出在给定范围内的值,然后将这些逻辑结果相加以得出一致性的度量"对于每一行。

可重复示例:

m1

上面我指出了预期结果,在每个值位于该行内任何其他值的+/- 1范围内的情况下。

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

相比之下,FALSE第4行中的值都不在彼此的单个数字值内,因此每个值都被指定为{{1}}。

任何指针都会非常感激吗?

更新

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

Ball Picking: Drawing unsorted, without replacement.

2 个答案:

答案 0 :(得分:3)

在得出答案之前,我只是想澄清你在问题中说过:

  

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

答案 1 :(得分: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