我想每次在一个矩阵的行中给出在给定范围内的值,然后将这些逻辑结果相加以得出一致性的度量"对于每一行。
可重复示例:
m1
上面我指出了预期结果,在每个值位于该行内任何其他值的+/- 1范围内的情况下。
在TRUE
的第一行内,第一个值(1)在该行中任何其他值的+/- 1范围内,因此等于m1
,依此类推。
相比之下,FALSE
第4行中的值都不在彼此的单个数字值内,因此每个值都被指定为{{1}}。
任何指针都会非常感激吗?
更新
感谢所提供的帮助,我现在可以计算满足任意大矩阵的上限标准的唯一值对(使用二项式系数,k从n中抽取,无需替换)。
答案 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