我想测试矩阵和的行和是否为0或1.总和是浮点数,因此与==
的直接比较不起作用。
以下是一个例子:
# Sample matrix
mat <- matrix(rnorm(50), nrow = 5)
# Choose some row to sum to 1. I will not know in advance which rows these are
sum.to.1 <- sample(1:5, 3)
mat.normalized <- mat
# Some rows sum to 1
mat.normalized[sum.to.1, ] <- mat[sum.to.1, ] / rowSums(mat[sum.to.1, ])
# Remaining rows sum to 0
mat.normalized[-sum.to.1, ] <- mat[-sum.to.1, ] - rowMeans(mat[-sum.to.1, ])
rowSums(mat.normalized) # very close, but not exactly, 1 or 0
# I want something like this:
# all(rowSums(mat.normalized) %in% c(0, 1))
如果我只是测试行是否总和为1,或者我知道哪些行提前为0,我会使用all.equal
。但是有些行总和为0,我不知道先验那些行会是什么行。
我也不能使用round
(我认为),因为所有行都将舍入为1或0,无论它们有多近。
有什么想法吗?似乎应该有一些简单的东西,但我无法弄明白。
答案 0 :(得分:2)
可能会有一个更有说服力的答案,但您可以使用sapply
和all.equal
这样的2次传递。
# get the sums
mySums <- rowSums(mat.normalized)
# run through values twice. Check for equal to 1, equal to 0, then sum the results
all(sapply(mySums, function(i) isTRUE(all.equal(i, 1))) +
sapply(mySums, function(i) isTRUE(all.equal(i, 0))) == 1)
[1] TRUE
我添加了== 1
,因为+
会返回一个数字向量,all
会抱怨这个。正如@ cath的评论所暗示的那样,最终可以避免== 1
。其中一种尝试是使用Reduce
。
all(Reduce("|", sapply(mySums, function(i) isTRUE(all.equal(i, 1))),
sapply(mySums, function(i) isTRUE(all.equal(i, 0)))))
或mapply
all(mapply("|", sapply(mySums, function(i) isTRUE(all.equal(i, 1))),
sapply(mySums, function(i) isTRUE(all.equal(i, 0)))))