为什么矩阵中的双/数值通过使用%in%范围返回错误的答案?

rpy*_*ing 6 r

我发现整数和双值在矩阵中表现不同,只有双数据类型返回错误答案.

#Test
m <- matrix(1:12,4,3)
which(!m[1,] %in% 1:5)

which(!m[1,] %in% 1:5)
[1] 3
Run Code Online (Sandbox Code Playgroud)

但是,当我更改double/numeric中的值时,

m <- matrix(c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), 4,3)
which(!m[1,] %in% 0.10:0.35)

   [,1] [,2] [,3]
[1,]  0.1  0.5  0.3
[2,]  0.2  0.6  0.4
[3,]  0.3  0.1  0.5
[4,]  0.4  0.2  0.6

which(!m[1,] %in% 0.10:0.35)
[1] 2 3
Run Code Online (Sandbox Code Playgroud)

只有2应该在答案中,因为1,3在0.10到0.35的范围内,为什么它在使用整数和数字的计算中是不同的.谢谢!

And*_*rie 9

这是因为你对:运营商的做法有一个有缺陷的理解. :不表示范围,但确实是生成离散值序列(以整数间隔)的快捷方式.

相比:

> 1:5
[1] 1 2 3 4 5

> 0.1:0.35
[1] 0.1
Run Code Online (Sandbox Code Playgroud)

所以你的第一段代码测试一个值是否是%in%整数1到5的范围.但是第二位代码测试你的数据是否等于0.1.

要获得您所追求的结果,您需要编写以下内容:

which(!(m[1, ] >= 0.1 & m[1, ] <= 0.35))
[1] 2
Run Code Online (Sandbox Code Playgroud)

  • 看看为什么`0.1:0.35`只返回`[1] 0.1`是有益的.':`的帮助解释了`from:to`相当于`seq(from,to,by = 1)`,它也只为OP使用的值返回`0.1`.这是因为`(0.1 + 1)> 0.35`. (4认同)