2013-03-20 2 views
1

먼저 20m X 30m 직사각형에서 두 점의 좌표를 모델화해야했습니다. 물론 이러한 점은 균일 분포 그래서 내 코드의 첫 번째 부분이다 따르 표시기 변수에서 값을 얻는 방법

X1 <- runif(1,0,20) 
    X2 <- runif(1,0,30) 
    point1 <- c(X1,X2) 
    point1 

는 I 번째 포인트 ('POINT2')에 대해 동일한 코드를 사용하지만, 각각 Y1 및 Y2와 X1과 X2를 대체했다.

내가 그 두 점 사이의 거리를 찾아야했다 : 나는 점은 서로 10m에 5m 내에있는 이벤트 같이 정의하면 이제

distance <- sqrt(((X1-Y1)^2)+((X2-Y2)^2)) 

을, 나는 표시기 변수를 찾을 필요 이 사건의 이것은 내가있어 무엇을,하지만 난 그게 맞아 잘 모르겠어요 :

x=0 
    if (distance < 10 & distance > 5) 
    { 
    x=1 
    } 
    Z <- c(distance,x) 

나는 각각의 시뮬레이션에 값을 저장 얼마나, 이러한 명령을 1,000 번 반복하고, 최소 및 최대를 찾을 수 있다면 1000의 reps의 분리 가치?

+0

마지막 sentence.You 2 천 × 2 행렬을 만들 것입니다 해결하기 위해 :

마지막 질문은 R의 행렬 연산을 사용하여 대답했다. 내가 대답 할 때 말했듯이 행렬을 사용하는 법을 배웁니다. –

+1

표시기 변수와 최소 및 최대 분판을 의미하도록 정의해야합니다. 인디케이터 변수로 점이 거리 내에 있는지 0/1을 의미하는 경우 @ SimonO101이 작동 할 것임을 보여 주었고 주석에 단순화했습니다. 최소/최대 분리의 경우 표시기 변수 == 1 인 이벤트의 최소 및 최대 거리를 찾으십니까? 그렇다면 선택된 이벤트에 대해 최소 거리를 얻기 위해'min (distance [distance> = 5 & distance <= 10])'(또는'max()')을 사용하십시오. –

답변

0

그들을 호출 할 수 있습니다.

points <- cbind(X1, X2) 

상황에 당신이 "병렬"배열로 X1 및 X2 값을 유지하고 달성하는 비 치수 객체가 아닌 매트릭스를 정의하고 싶다고 제안 : 당신이 사용하고자하는 확신 해요.

points1 <- matrix(runif(2000), ncol=2) 
points1 <- matrix(runif(2000), ncol=2) 
dists <- rowSums((points1-points2)^2) 
Z <- dists <10 & dists >5 
+0

그는 자신이하는 일에 대해 본문 텍스트에서 Y1을 정의합니다. –

+0

나는 Y1과 Y2를 정의했다. – Mathlete

+1

@ SimonO101 * 그녀는 그렇지만 부적절하다고 생각합니다. – Mathlete

0

닫기. ifelse 또는 단순히 벡터화 된 양식을 사용하여 이벤트를 정의하십시오. 1000 샘플의 경우, runif을 사용하여 1000 개의 샘플을 생성하면됩니다. 또한 c(X1 , X2) 할 필요가 없습니다, 당신은 당신이 X1과 X2를 사용하고 나중에 정의되지 않은 Y1을 참조 한순간에 ... 당신의 거리 계산에서 벡터로

#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 
+2

'ifelse'는 벡터화되지 않았습니다. 그 의미는 일반적으로 의미합니다. 그냥 루프를 숨 깁니다. 이 경우 R은 'TRUE'에 대해 '1'로, 'FALSE'에 대해 '0'으로 처리하므로 논리 벡터 '거리> = 5 및 거리 <= 10'만 있으면됩니다. 원한다면'as.numeric()'로 감쌀 수 있지만 여기에서는'ifelse'가 필요 없습니다. –

+0

그러나 분과 최대 간격을 어떻게 찾을 수 있습니까? – Mathlete

+0

@GavinSimpson 사실입니다. 적절하게 편집 할 것입니다. –

관련 문제