2015-01-09 2 views
0

간단하게 보이지만 알아낼 수는 없습니다.무작위로 임의의 숫자를 기반으로 행을 선택하십시오.

나는 하나의 데이터 프레임으로 많은 동물 위치 데이터 (217 개체)를 가지고 있습니다. X가 6-156의 범위 내에 있다는 경고로 추가 분석을 위해 개인당 X 위치를 무작위로 선택하려고합니다.

그래서 처음에는 무작위로 6-156 범위의 값을 선택하고 해당 값 (예 : 56)을 사용하여 임의로 첫 번째 개별 동물로부터 56 개 위치를 추출하는 루프를 설정하려고합니다.

for(i in unique(ANIMALS$ID)){ 
    sub<-sample(6:156,1) 
sub2<-i([sample(nrow(i),sub),]) 
} 

이러한 접근 방식은 .. 어떤 제안이나 이전 게시물이 도움이 될 것

for(i in unique(ANIMALS$ID)){ 
    sub<-sample(6:156,1) 
    rand<-i[sample(1:nrow(i),sub,replace=FALSE),] 
} 

이 중 하나가 작동하지 않았다 ... 그래서 그것을 조정 시도 작동하지 않았다! 데이터 파일의

헤드 ... 동물은 안양의 이름, ID는 고유 한 개인

> FID  X  Y MONTH DAY YEAR HOUR MINUTE SECOND ELKYR SOURCE ID animalid 
1 0 510313 4813290  9 5 2008 22  30  0 342008  FG 1  1  
2 1 510382 4813296  9 6 2008 1  30  0 342008  FG 1  1  
3 2 510385 4813311  9 6 2008 2  0  0 342008  FG 1  1 
4 3 510385 4813394  9 6 2008 3  30  0 342008  FG 1  1 
5 4 510386 4813292  9 6 2008 2  30  0 342008  FG 1  1 
6 5 510386 4813431  9 6 2008 4  1  0 342008  FG 1  1 
+3

데이터의 일부를 표시 할 수 있습니까? 아마'dput (head (ID))'일까요? – LyzandeR

+0

우선,'ANIMALS'는 dataFrame의 이름입니까, 아니면'ID'입니까? 'unique()'문이 설정된 방식으로,'ID'는 데이터 프레임의 이름이고'ANIMALS' 벡터를 돌고 있습니다. – Steven

답변

0

여기 mapply를 사용하는 한 가지 방법입니다을 나타냅니다. 이 함수는 두 개의리스트 (또는리스트로 강제 변환 될 수있는 것)를 취해 함수 FUN을 해당 요소에 적용합니다.

# simulate some data 
xy <- data.frame(animal = rep(1:10, each = 10), loc = runif(100)) 

# calculate number of samples for individual animal 
num.samples.per.animal <- sample(3:6, length(unique(xy$animal)), replace = TRUE) 

num.samples.per.animal 
[1] 6 3 4 4 6 3 3 6 3 5 

# subset random x number of rows from each animal 
result <- do.call("rbind", 
        mapply(num.samples.per.animal, split(xy, f = xy$animal), FUN = function(x, y) { 
        y[sample(1:nrow(y), x),] 
        }, SIMPLIFY = FALSE) 
) 
result 

    animal  loc 
7  1 0.99483999 
1  1 0.50951321 
10  1 0.36505294 
6  1 0.34058842 
8  1 0.26489107 
9  1 0.47418823 
13  2 0.27213396 
12  2 0.28087775 
15  2 0.22130069 
23  3 0.33646632 
21  3 0.02395097 
28  3 0.53079981 
29  3 0.85287600 
35  4 0.84534073 
33  4 0.87370167 
31  4 0.85646813 
34  4 0.11642335 
46  5 0.59624723 
48  5 0.15379729 
45  5 0.57046122 
42  5 0.88799675 
44  5 0.62171858 
49  5 0.75014593 
60  6 0.86915983 
54  6 0.03152932 
56  6 0.66128549 
64  7 0.85420774 
70  7 0.89262455 
68  7 0.40829671 
78  8 0.19073661 
72  8 0.20648832 
80  8 0.71778913 
73  8 0.77883677 
75  8 0.37647108 
74  8 0.65339300 
82  9 0.39957202 
85  9 0.31188471 
88  9 0.10900795 
100  10 0.55282999 
95  10 0.10145296 
96  10 0.09713218 
93  10 0.64900866 
94  10 0.76099256 

EDIT 여기

행수가 할당되어야 샘플의 수보다 적은 경우에도 다른 경우를 처리 (더 간단) 방식이다.

set.seed(357) 
result <- do.call("rbind", 
        by(xy, INDICES = xy$animal, FUN = function(x) { 
        avail.obs <- nrow(x) 

        num.rows <- sample(3:15, 1) 
        while (num.rows > avail.obs) { 
         message("Sample to be larger than available data points, repeating sampling.") 
         num.rows <- sample(3:15, 1) 
        } 
        x[sample(1:avail.obs, num.rows), ] 
        })) 
result 
+0

안녕하세요, sample.int의 오류 (길이 (x), 크기, 바꾸기, prob) : 'replace = FALSE'일 때 채우기보다 큰 표본을 사용할 수 없음 – odocoileus

+0

개별 동물마다 행 수가 다르다는 점을 추가해야합니다. . – odocoileus

+0

@odocoileus 샘플로 원하는 것보다 적은 포인트가있는 경우를 수용 할 수있는 다른 솔루션을 추가했습니다. 이 문제를 해결할 수있는 또 다른 방법은 가능한 모든 포인트를 취하는 것입니다. 그렇게하기로 결심했다면,'if' 절을 쓰는 연습으로 그 것을 남겨 둘 것입니다. –

0

내가 너무 많이 배우기 때문에 나는 Stackoverflow를 좋아한다. @RomanLustrik은 간단한 해결책을 제공했습니다. 내 것은 똑바로 싫어합니다 :

# simulate some data 
xy <- data.frame(animal = rep(1:10, each = 10), loc = runif(100)) 

newVec <- NULL #Create a blank dataFrame 

for(i in unique(xy$animal)){ 
    #Sample a number between 1 and 10 (or 6 and 156, if you need) 
    samp <- sample(1:10, 1) 
    #Determine which rows of dataFrame xy correspond with unique(xy$animal)[i] 
    rows <- which(xy$animal == unique(xy$animal)[i]) 
    #From xy, sample samp times from the rows associated with unique(xy$animal)[i] 
    newVec1 <- xy[sample(rows, samp, replace = TRUE), ] 
    #append everything to the same new dataFrame 
    newVec <- rbind(newVec, newVec1) 
    } 
+0

sample.int의 오류 (length (x), size, replace, prob) : 잘못된 첫 번째 인수 hmm ... 분석을 엉망으로 만들고있는 행이 156 행 미만인 개인이 있을지도 모른다고 생각했습니다. = 3), 그리고 reran 분석 ... 여전히 같은 오류 메시지가 ... 어떤 아이디어? 미리 감사드립니다! – odocoileus

+0

'length (x)'의 값은 무엇입니까? – Steven

+0

길이 (x) = 객체를 찾을 수 없습니다 – odocoileus

관련 문제