有多个变量和条件时如何编写循环语句

时间:2019-08-28 11:36:14

标签: r loops conditional-statements

如果我们有经度和纬度,我需要找出一对之间的距离。还要有条件,如果任何变量为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。如果所有条件     然后满足就可以了。

1 个答案:

答案 0 :(得分:0)

我认为“答案”是首先要理解的是,R数值向量中不存在确切命名为Null的值。您需要了解NA将达到您所说的Null的目的。目前尚不清楚您的数据采用哪种格式,但是如果您的LatitudeLongitude列属于“字符”类,则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时,数值上不完全相等。