逐行计算矩阵上限范围内的 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
我想在矩阵的给定范围内逐行计算一个值,然后将这些逻辑结果相加得出"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 equalsTRUE
, 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