比较浮点数超过1的整数

时间:2017-02-13 15:02:45

标签: r floating-point

我想测试矩阵和的行和是否为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,无论它们有多近。

有什么想法吗?似乎应该有一些简单的东西,但我无法弄明白。

1 个答案:

答案 0 :(得分:2)

可能会有一个更有说服力的答案,但您可以使用sapplyall.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)))))