如果我们有经度和纬度,我需要找出一对之间的距离。还要有条件,如果任何变量为null,则结果应该为Null
,如果我们有值den,则应该给出距离。如何为同一对象创建循环?
Pairs Latitude Longitude
16285 50.0354 19.2343
16285 50.0748 19.9125
16283
16283
16281
16281
16279
16279
16277
16277
16275
16275
16273
16273
16271 51.7549 19.463
16271 50.5908 21.1178
16269 33.5912 130.4013
16269 34.8234 134.8785
Pairs Latitude Longitude distance
16285 50.0354 19.2343 500
16285 50.0748 19.9125 500
16283
16283
16281
16281
16279
16279
16277
16277
16275
16275
16273
16273
16271 51.7549 19.463 200
16271 50.5908 21.1178 200
16269 33.5912 130.4013 100
16269 34.8234 134.8785 100
我该如何通过Loop来实现
lat1 = as.numeric(fd2[3,3]) lat2 = as.numeric(fd2[4,3])
long1 =as.numeric(fd2[3,4])
long2 =as.numeric(fd2[4,4])
earth.dist <- function (long1, lat1, long2, lat2) { rad <- pi/180
a1 <- lat1 * rad
a2 <- long1 * rad
b1 <- lat2 * rad
b2 <- long2 * rad
dlon <- b2 - a2
dlat <- b1 - a1
a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2
c <- 2 * atan2(sqrt(a), sqrt(1 - a))
R <- 6378.145
d <- R * c
return(d) }
dist_km <- earth.dist(long1,lat1,long2,lat2)
dist_mi <- dist_km / 1.609344
myout <- data.frame("dist_km" = dist_km, "dist_mi" = dist_mi)
条件: 检查对是否相等 如果其中存在任何值,则关联的纬度和经度不应为null,然后应显示null。如果所有条件 然后满足就可以了。
答案 0 :(得分:0)
我认为“答案”是首先要理解的是,R数值向量中不存在确切命名为Null
的值。您需要了解NA
将达到您所说的Null
的目的。目前尚不清楚您的数据采用哪种格式,但是如果您的Latitude
和Longitude
列属于“字符”类,则as.numeric
会变成任何形式将空白字符值转换为NA值。然后,任何涉及NA值的算术计算都将自动产生NA结果。因此,R的运作方式和目标不会有任何问题。
dat <- read.table(text="Pairs Latitude Longitude
16285 50.0354 19.2343
16285 50.0748 19.9125
16283
16283
16281
16281
16279
16279
16277
16277
16275
16275
16273
16273
16271 51.7549 19.463
16271 50.5908 21.1178
16269 33.5912 130.4013
16269 34.8234 134.8785
", header =TRUE, fill=TRUE)
这实际上为您提供了所有数字列,因此不需要as.numeric操作(尽管它们也不会造成任何危害。)
str(dat)
'data.frame': 18 obs. of 3 variables:
$ Pairs : int 16285 16285 16283 16283 16281 16281 16279 16279 16277 16277 ...
$ Latitude : num 50 50.1 NA NA NA ...
$ Longitude: num 19.2 19.9 NA NA NA ...
然后,我们需要将您的功能代码放入一种可剪切并粘贴到控制台会话中的表格中,这是通过编辑您的问题正文来完成的。对其行为进行一些测试。
前两行并不是特别接近,因此尚不清楚您对该距离列中的距离有什么期望:
> earth.dist(dat[1,2], dat[1,3],dat[2,2],dat[2,3])
[1] 75.60999
> earth.dist(dat[1,2], dat[1,3],dat[1,2],dat[1,3])
[1] 0
我尚未检查该d
算法的正确性,但似乎可以为1度拉蒂特德的差异提供合理的值:
earth.dist(1, 1,1,2)
[1] 111.3196
似乎您可能想测试一下连续的线是否彼此靠近,在这种情况下,使用all.equal函数可以进行测试,当点接近但使用“公差”值返回TRUE时,数值上不完全相等。