2017-10-18 1 views
1

는 플롯을 볼 수다른 점의 반경 내에서 가장 큰 점을 식별 하시겠습니까?

tag <- as.character(c(1,2,3,4,5,6,7,8,9,10)) 

species <- c("A","A","A","A","B","B","B","C","C","D") 

size <- c(0.10,0.20,0.25,0.30,0.30,0.15,0.15,0.20,0.15,0.15) 

radius <- (size*40) 

x <- c(9,4,25,14,28,19,9,22,10,2) 

y <- c(36,7,15,16,22,24,39,20,34,9) 

data <- data.frame(tag, species, size, radius, x, y) 


# Plot the points using qplot (from package tidyverse) 
qplot(x, y, data = data) + 
    geom_point(aes(colour = species, size = size)) 

지금은 무엇을 의미하는지에 관해 알기 위해이 예제 데이터를 사용, 제가하고 싶은 것은 각각의 "종 A"지점, 나는 가장 큰 지점을 확인하고 싶습니다 크기 * 40의 반경 이내.

예를 들어 플롯의 왼쪽 하단에서 종 A (태그 2)가 가까운 종 D 포인트를 포함 할 정도로 큰 반경을 생성한다는 것을 알 수 있습니다.

그러나 플롯 (태그 3)의 맨 오른쪽에있는 종 A 점은 가까운 종 B와 종 C 점 모두를 포함 할 정도로 큰 반경을 생성합니다. 종 A 반경 내에서 가장 큰 개체를 식별하는 출력을 원합니다.

나는 각 종 점을 가장 큰 "반경"지점을 찾아 얻기 위해이 데이터 세트에 (오히려)를 실행할 수있는 것을 알고이 같은 출력을 좀하고 싶습니다

:

종을 반경 점 ---- 최대 점

종 태그 ----- 1 종 C 태그 9

종 태그 ----- 2 종 D 태그 10

종 태그 3 ----- 종 B 태그 (5)

종 태그 4 ----- 종 C 태그 8

내가 과거에 어떤 플롯을 만들기 위해 spatstat 및 CTFSpackage을 사용했지만 나는 "반경 내에서 가장 큰 이웃을 찾는"방법을 알아낼 수 없습니다. 아마 ArcMAP에서이 문제를 해결할 수 있을까요? 또한 이것은 단지 작은 예제 데이터 집합입니다. 현실적으로 나는 수천의 점에 대해 "반경 내에서 가장 큰 이웃"을 찾고자합니다.

도움이나 의견을 보내 주시면 대단히 감사하겠습니다.

+0

'방금 각 종 'SQRT 같은 태그 각 포인트의 유클리드 거리를 산출 할 수 base' ((X1-X2)^2 + (Y1-Y2)^2)'. 일단 Species A 태그에 대한 거리 벡터를 가지고 있다면, 'max (distances_vector [distanceances_vector <40])'와 같은 것을 사용할 수 있습니다. 하나의 케이스에 대해 설정하고 각각의 Species A 태그에 대한 반복 작업을 할 수 있는지 확인하십시오. – Djork

+1

전체 개체 (또는 중심 부분 만)가 해당 반지름 이내에 있어야합니까? –

+0

종으로 태그 1, 같은 크기의 B 7도 있습니다 ... 아니면 정확하게 이해하지 못하겠습니까? – Suren

답변

0

다음은 각 종에 대해 주어진 반경 내에있는 가장 큰 종과 태그 쌍을 찾습니다. 에서는

all_df <- data # don't wanna have a variable called data 
res_df <- data.frame() 
for (j in 1 : nrow(all_df)) { 

    # subset the data 
    df <- subset(all_df, species != species[j]) 
    # index of animals within radius 
    ind <- which ((df$x - x[j])^2 + (df$y - y[j])^2 < radius[j]^2) 

    # find the max `size` in the subset df 
    max_size <- max(df$size[ind]) 
    # all indices with max_size in df 
    max_inds <- which(df$size[ind] == max_size) 
    # pick the last one is there is more than on max_size 
    new_ind <- ind[max_inds[length(max_inds)]] 

    # results in data.frame 
    res_df <- rbind(res_df, data.frame(org_sp = all_df$species[j], 
            org_tag = all_df$tag[j], 
            res_sp = df$species[new_ind], 
            res_tag = df$tag[new_ind])) 
} 

res_df 
#  org_sp org_tag res_sp res_tag 
# 1  A  1  C  9 
# 2  A  2  D  10 
# 3  A  3  B  5 
# 4  A  4  C  8 
# 5  B  5  A  3 
# 6  B  6  C  8 
# 7  B  7  C  9 
# 8  C  8  B  5 
# 9  C  9  B  7 
# 10  D  10  A  2 
+0

고맙습니다. 2 개 이상의 다른 종족이 같은 크기이고 반경 내에서 (종 A 태그 1과 같은 경우) 가장 높은 순위의 종만이 선택된다는 것을 잊어 버렸습니다. 따라서 A는 B, C 및 D보다 선택 될 것입니다. 그리고 종 B는 C와 D에서만 선택 될 것입니다. 기본적으로 하나의 개별 지점으로 선택 범위를 좁힐 수있는 종 계층 구조를 포함하고 싶습니다. – Jay

+0

"순위"란 무엇을 의미합니까? ... – Suren

+0

스크립트에 오류가 발생했습니다. (df $ size [ind] == maxs) : 'maxs'개체를 찾을 수 없음 오류가 발생했습니다. – Jay

관련 문제