首先,我必须在20米X 30米的矩形中模拟两点的坐标。显然这些点遵循统一分布,所以这是我的代码的第一部分:
X1 <- runif(1,0,20)
X2 <- runif(1,0,30)
point1 <- c(X1,X2)
point1
我对第二个点('point2')使用相同的代码,但分别用Y1和Y2替换了X1和X2。
然后我必须找到两点之间的距离: distance <- sqrt(((X1-Y1)^2)+((X2-Y2)^2))
现在,如果我将A定义为点在彼此5m到10m之间的事件,我需要找到此事件的指示变量。 这就是我所要做的,但我不确定它是否正确:
x=0
if (distance < 10 & distance > 5)
{
x=1
}
Z <- c(distance,x)
如果我要重复这些命令1000次,我将如何在每次模拟中存储值并在1000次重复中找到最小和最大分离值?
答案 0 :(得分:0)
关闭。使用ifelse
或简单的矢量化形式来定义您的活动。对于1000个样本,您只需使用runif
生成1000个样本。此外,不需要c(X1 , X2)
,您可以在距离计算中将它们称为向量...
#Just make 1000 calls to runif
X1 <- runif(1000,0,20)
X2 <- runif(1000,0,30)
Y1 <- runif(1000,0,20)
Y2 <- runif(1000,0,30)
distance <- sqrt(((X1-Y1)^2)+((X2-Y2)^2))
head(distance)
#[1] 9.050522 19.512849 10.413407 7.736564 2.742174 13.729397
# gives 1 if points are within 5 to 10m of each other
event <- ifelse ( distance >= 5 & distance <= 10 , 1 , 0 )
#Or even better, from @GavinSimpson's comment just use a vectorised form (we use as.nuemric to turn TRUE / FALSE into 1 and 0, but you could leave that out if you wish)
event <- as.numeric( distance >= 5 & distance <= 10 )
head( event )
#[1] 1 0 0 1 0 0
# And the minimum and maximum sepration distance of those events
min(distance[distance >= 5 & distance <= 10])
#[1] 5.017296
max(distance[distance >= 5 & distance <= 10])
#[1] 9.989868
答案 1 :(得分:0)
有一次你使用X1和X2,后来引用了尚未定义的Y1。我很确定你想要使用:
points <- cbind(X1, X2)
上下文表明您希望将X1和X2值保持为“并行”排列,并且定义矩阵而不是非尺寸对象将实现该目标。
使用R的矩阵运算回答最后一个问题:
points1 <- matrix( runif(2000), ncol=2)
points1 <- matrix( runif(2000), ncol=2)
dists <- rowSums( (points1-points2)^2 )
Z <- dists <10 & dists >5