R中的"匹配"中有错误吗?

owe*_*tin 4 r

这怎么可能:

> match(1.68, seq(0.01,10, by = .01))
[1] 168
> match(1.67, seq(0.01,10, by = .01))
[1] NA
Run Code Online (Sandbox Code Playgroud)

R函数match是否有错误?

42-*_*42- 7

典型的R-FAQ 7.31问题.不是错误.要避免这种常见的用户错误,请使用函数findInterval并稍微模糊边界.(或对整数序列进行选择.)

> findInterval(1.69, seq(0.01,10, by = .01))
[1] 169
> findInterval(1.69, seq(0.01,10, by = .01)-.0001)
[1] 169
> findInterval(1.68, seq(0.01,10, by = .01)-.0001)
[1] 168
> findInterval(1.67, seq(0.01,10, by = .01)-.0001)
[1] 167
> findInterval(1.66, seq(0.01,10, by = .01)-.0001)
[1] 166
Run Code Online (Sandbox Code Playgroud)


Jos*_*ien 6

对于这类问题,我更喜欢钱伯斯在他的"数据分析软件"一书中描述的解决方案:

match(1.68, seq(1, 1000, by = 1)/100)
# [1] 168
match(1.67, seq(1, 1000, by = 1)/100)
# [1] 167
Run Code Online (Sandbox Code Playgroud)

(它的工作原理是因为生成一个整数序列不涉及浮点问题.舍入仅在除以100时出现,并匹配通过将键入的数字转换1.67为二进制而产生的舍入.)

这种解决方案具有的凭借找到匹配为多个像1.6744,这显然不是序列中0.10, 0.11, 0.12, ..., 9.98, 9.99, 10.00:

match(1.6744, seq(1,1000, by = 1)/100)
# [1] NA                               ## Just as I'd like it!
Run Code Online (Sandbox Code Playgroud)