0

두 세트의 셀 데이터가 있습니다. 각 세트에는 x, y 좌표가있는 여러 행 (개별 셀)이 있습니다. 데이터 세트 A의 모든 셀에 대해 가장 작은 거리를 찾고 싶습니다. 데이터 셀은 BI하기에 가장 가까운 이웃 (좌표 쌍 사이의 거리)

예 DSA = 0,0 0,1 1,0 DSB 세트 B = 2,2

거리 (d)를 찾을 수있는 세포를 B.

을 설정할 않았다 이

ax <- DS1$X 
ay <- DS1$Y 
bx <- DS2$X 
by <- DS2$Y 
D <- c(sqrt((ax-bx)^2 + (ay-by)^2)) 
D 
[1] 2.828427 2.236068 2.236068 

그래서 내가 필요로하는 것을주었습니다. DSB에 여러 점이있을 경우 문제가 있음

모든 BSB 값으로 모든 DSA 값을 시도하도록 루프를 추가해야합니까?

DSA의 첫 번째 지점 만 DSB에서 시작하고 두 번째 DSA 값은 DSB의 두 번째 값만 사용됩니다. DSB의 모든 값에 의해 DSA의 첫 번째 값을 수행 한 다음이 두 숫자 중 가장 작은 값만 반환하고 DSA의 모든 값을 반복하여 유지하기를 원합니다.

답변

0

간편한 방법은 dist 기능을 사용하는 것입니다. rbind 함수를 사용하여 data.frames를 결합하면 dist은 쌍 거리를 가진 행렬을 반환합니다. 여기 내가 만든 장난감의 예가 있습니다.

set.seed(10101) 
df1 <- data.frame(x=rnorm(9, 1), y=rnorm(9,-1)) 
df2 <- data.frame(x=rnorm(10, 1,), y=rnorm(10,1)) 
distances <- as.matrix(dist(rbind(df1, df2))) 

df1의 가장 가까운 지점을 df2의 각 지점에 배치합니다. 우리는 행렬의 하위 블록만을 고려하기 때문에 검색 할 적절한 행 및 열 인덱스를 계산해야합니다.

row.start <- nrow(df1)+1 
row.end <- nrow(df1) + nrow(df2) 
col.start <- 1 
col.end <- nrow(df1) 

우리는 지금 각 행에서 가장 작은 거리를 찾기 위해 apply 기능을 사용할 수 있습니다. 다음 코드 줄을 사용하여이를 수행 할 수 있습니다.

apply(distances[row.start:row.end, col.start:col.end], 1, which.min) 
+0

감사 JRD 가까운 DSB 포인트에 DSA의 각 점에 대한 짧은 차이이 같은 것을 산출해야하지만 끝에 (DSB에 가까운 지점 2,2- =) 이 문제가 발생했습니다 – StevenL

+0

DSA = 0,0 0,1 1,0 DSB = 2,2,7,7 'df1 <-data.frame (DSA)' 'df2 <-data.frame (DS3)' '거리 < -as.matrix (DIST (rbind (DF1, DF2))) '거리 0.000000 1.000000 1.000000 2.828427 9.899495 1.000000 0.000000 2 1.414214 2.236068 9.219544 1.000000 1.414214 3 0.000000 2.236068 9.219544 2.828427 2.236068 4 2.236068 0.000000 7.071068 012 3,516,5 9.899495 9.219544 9.219544 7.071068 0.000000 'row.start <-nrow (DF1) +1 > row.end <-nrow (DF1) + nrow (DF2) > col.start <-1 > col.end <4 5 ' – StevenL

+0

은 4 5와 2를 산출합니다. 2. 내 손으로 계산합니다 (예 : 0, 1, 2). DSA 행 1 = 2.828 (DSB에서 가장 가까운 점 = 2,2), 행 2 = 2.236 (DSB에서 가장 가까운 점 = 2,2) 행 3 = 2.236 (DSB에서 가장 가까운 점 = 2,2)을 가져야합니다. 어떤 제안이든지 – StevenL

0

@jrd 서식 이슈에 대해 미안합니다. 오버플로 스택이 새로 도입되었습니다. 나는 이것이 행렬 수집 무엇 내가 모두 DSA와 DSB에 대한 CSV 파일을 가져 오기하고

DSA 
    X Y 
1 0 0 
2 0 1 
3 1 0 

DSB 
    X Y 
1 2 2 
2 7 7 

df1<-data.frame(DSA[,1:2) 
df2<-data.frame(DSB[,1:2) 
distances<-as.matrix(dist(rbind(df1,df2))) 

이 거리 행렬은 내게에서이

> distances 
     1  2  3  4  5 
1 0.000000 1.000000 1.000000 2.828427 9.899495 
2 1.000000 0.000000 1.414214 2.236068 9.219544 
3 1.000000 1.414214 0.000000 2.236068 9.219544 
4 2.828427 2.236068 2.236068 0.000000 7.071068 
5 9.899495 9.219544 9.219544 7.071068 0.000000 

을 제공합니다 (헤더는 파일의 X 및 Y입니다) 동일한 데이터 집합의 서로 (심지어는 점을 모든 점에서. 난 그냥

distances 
     1  2 
1 2.828427 9.899495 
2 2.236068 9.219544 
3 2.236068 9.219544 

하지 않도록 같아야합니다 DSB하는 DSA에서 방법을 단지 그래프 교장 선생님의이 부분을에 trix. 내가 사용하는 코드의 나머지 부분은 내가 (DSB = 2,2에 가까운 점) DSA 행 1 = 2.828를 얻어야한다

row.start<-nrow(df1)+1 
row.end<-nrow(df1)+nrow(df2) 
col.start<-1 
col.end<-nrow(df1) 
apply(distances[row.start:row.end, col.start:col.end],1,which.min) 

수율 4 5 2 2. 내 손 계산했다, 행 2 = 2.236 (가장 가까운 DSB = 2,2) 행 3 = 2.(236)는 희망 여전히 D가

 X Y D 
    1 0 0 2.828 
    2 0 1 2.236 
    3 1 0 2.236 
관련 문제