在包含纬度的列中搜索时,R返回null

在包含纬度的列中搜索时,R返回null,r,dataframe,R,Dataframe,我正在加载斯坦福存储库中可用的R格式的Gowalla数据集,并重命名列名。 它返回null,因为它是数据中的第一个纬度 然而,如果我搜索vid,它是一个整数,而不是像纬度一样的小数 which(Gowalla$vid==22847) 它给出了该值的行号 所以我的问题是为什么我不能用“which”函数搜索纬度和经度,为什么gowalla在我的例子中返回null 一旦我找到了这个问题的答案,我就可以使用if-else搜索伦敦边界框中的行。有没有有效的方法来搜索伦敦边界框中的行 伦敦的边界是 纬度

我正在加载斯坦福存储库中可用的R格式的Gowalla数据集,并重命名列名。

它返回null,因为它是数据中的第一个纬度

然而,如果我搜索vid,它是一个整数,而不是像纬度一样的小数

which(Gowalla$vid==22847)
它给出了该值的行号

所以我的问题是为什么我不能用“which”函数搜索纬度和经度,为什么gowalla在我的例子中返回null

一旦我找到了这个问题的答案,我就可以使用if-else搜索伦敦边界框中的行。有没有有效的方法来搜索伦敦边界框中的行

伦敦的边界是 纬度51.672343和51.384940以及 经度0.148271经度-0.351468


谢谢。

尝试使用

which(sapply(Gowalla$lat, all.equal,30.23591)==TRUE)
如中所述,浮点运算的陷阱可能导致违反直觉的结果。函数
all.equal()
专门用于捕获此类情况。如果在计算精度范围内满足等式,则返回
TRUE
。但是,由于在数字本质上不相等的情况下,它以相当详细的方式返回差异,因此我们需要显式地检查输出是否等于
TRUE
,以便仅过滤满足此断言的结果


正如@digEmAll所指出的,另一种方法(在这种情况下似乎更有希望)包括引入用户定义的误差裕度或公差,如:

tol <- 1.e-4
并将中心值定义为

lat_c <- (51.672343 + 51.384940) / 2
lon_c <- (0.148271 - 0.351468) /2
在脚本开始时,尤其是当选择
tol
较小、接近或低于
1e-7



感谢@nicola指出此答案前一版本中的错误。

尝试使用

which(sapply(Gowalla$lat, all.equal,30.23591)==TRUE)
如中所述,浮点运算的陷阱可能导致违反直觉的结果。函数
all.equal()
专门用于捕获此类情况。如果在计算精度范围内满足等式,则返回
TRUE
。但是,由于在数字本质上不相等的情况下,它以相当详细的方式返回差异,因此我们需要显式地检查输出是否等于
TRUE
,以便仅过滤满足此断言的结果


正如@digEmAll所指出的,另一种方法(在这种情况下似乎更有希望)包括引入用户定义的误差裕度或公差,如:

tol <- 1.e-4
并将中心值定义为

lat_c <- (51.672343 + 51.384940) / 2
lon_c <- (0.148271 - 0.351468) /2
在脚本开始时,尤其是当选择
tol
较小、接近或低于
1e-7




感谢@nicola指出此答案上一版本中的错误。

==
不应用于搜索浮点值。您应该使用
(abs(Gowalla$lat-30.23591)将浮点数与
==
进行比较从来都不是一个好主意。使用
all.equal()
取而代之。有关更多信息,请参见此。当
R
打印
数值时,它会对值进行舍入。因此
30.23591
不是实际值,而是舍入版本。如果您尝试
哪个(Gowalla$lat==Gowalla$lat[1])
您将收到一个非空结果。要选择框中的数据,请尝试
lat<51.672343&lat>51.384940&lon-0.351468
(我省略了
Gowalla$
部分)。将边界框a转换为多边形,并使用
rgeos
包查找多边形内的点,或者
sp::points,不是更容易吗?在.polygon
?@RHertel:你说的不完全正确。R有整数(只有32位),因此你可以转换数字(=双64位)使用
as.integer
函数
=
不应用于搜索浮点值。您应该使用
,它(abs(Gowalla$lat-30.23591)将浮点数与
=
进行比较从来都不是一个好主意。使用
all.equal()
取而代之。有关更多信息,请参见此。当
R
打印
数值时,它会对值进行舍入。因此
30.23591
不是实际值,而是舍入版本。如果您尝试
哪个(Gowalla$lat==Gowalla$lat[1])
您将收到一个非空结果。要选择框中的数据,请尝试
lat<51.672343&lat>51.384940&lon-0.351468
(我省略了
Gowalla$
部分)。将边界框a转换为多边形,并使用
rgeos
包查找多边形内的点,或者
sp::points,不是更容易吗?在.polygon
?@RHertel:你说的不完全正确。R有整数(只有32位),因此你可以转换数字(=双64位)使用
as.integer
函数创建整数谢谢您的解释。除了代码中缺少一个打字错误
之外,我尝试了它,它给了我
整数(0)
!为了避免复杂性,我可以将所有的lat和LONG行乘以
1000000
,并将所有数据转换为整数,然后在执行计算后,我可以再次除法并取回我的lat和LONG吗?这将不会太麻烦!我检查了您的文件,第一个条目的lat值是
30.2359091167
。因此该数字与
30.23591
之间存在很大差异,在这种情况下
all.equal()
不会返回
TRUE
。您可以尝试使用
选项(数字=19)
更详细地显示数字;或者使用@digEmAll描述的方法-引入个人准确度阈值。@RHertel:没问题,请自由使用我的代码来完成答案;)@digEmAll非常感谢。我编辑了答案,并为您提供了解决方案的积分,包括公差。非常感谢@RHertelTh
lat_c <- (51.672343 + 51.384940) / 2
lon_c <- (0.148271 - 0.351468) /2
which(abs(Gowalla$lat - lat_c) < tol_lat & abs(Gowalla$long - lon_c) < tol_lon)
options(digits=19)