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