2017-03-10 1 views
2

모든 지역마다 하나의 임의 사이트를 가져 와서 새 데이터 프레임을 만들고 모든 사이트를 샘플링 할 때까지이 프로세스를 반복하고 싶습니다. 따라서 각 데이터 프레임에는 동일한 지역의 동일한 사이트가 포함되지 않습니다.그룹별로 무작위로 샘플링하고 그룹 내의 모든 엔티티가 샘플링 될 때까지 새 데이터 프레임을 만듭니다.

실제 데이터 프레임의 몇몇 영역에는 다른 영역보다 더 많은 사이트 (지역 C에는 4 개의 사이트가 있음)가 있습니다. 그 행을 제거하고 싶습니다 (아마 여러 개의 데이터 프레임을 만들기 전에이 작업을 수행해야합니다). 주어진에 대해 동일한 사이트가 포함 된 데이터 프레임을 3 회 다음 코드 반복

mydf <- read.table(header = TRUE, text = 'V1 V2 Region Site 
5 1 A X1 
5 6 A X2 
8 9 A X3 
2 3 B X1 
3 1 B X2 
7 8 B X3 
1 2 C X1 
9 4 C X2 
4 5 C X3 
6 7 C X4') 

이 생성 여기

는 예시적인 데이터 프레임을 인 (실수 하나> 100 개 지역 및> 10 개 사이트 지역마다 있음) Region (두 번째 및 세 번째 테이블 모두 Region A에 대해 Site X2를 가짐).
do.call(rbind, lapply(split(mydf, mydf$Region), function(x) x[sample(nrow(x), 1), ])) 

    V1 V2 Region Site 
A 8 9  A X3 
B 2 3  B X1 
C 6 7  C X4 

V1 V2 Region Site 
A 5 6  A X2 
B 7 8  B X3 
C 9 4  C X2 

    V1 V2 Region Site 
A 5 6  A X2 
B 3 1  B X2 
C 6 7  C X4 

당신은 모든 데이터 프레임이 모든 지역을 포함 할 수 있도록 나 여러 데이터 프레임을 만들 수 있도록 도와 주 시겠어요하지만, 각 데이터 프레임은 독특한 지역 사이트의 조합을 포함한다.

EDIT : 예상되는 출력입니다. 이들을 생성하려면 첫 번째 샘플링에서 모든 Region에서 임의로 하나의 Site (행)을 그리고 데이터 프레임을 만듭니다. 두 번째 샘플링에서 동일한 프로세스를 반복하되 주어진 지역에 대해 동일한 사이트를 그릴 수는 없습니다. 내가 원하는 것은 Region-Site의 고유 한 조합을 포함하는 독립적 인 데이터 프레임입니다.

V1 V2 Region Site 
5 1 A X1 
7 8 B X3 
1 2 C X1 

V1 V2 Region Site 
5 6 A X2 
3 1 B X2 
4 5 C X3 

V1 V2 Region Site 
8 9 A X3 
2 3 B X1 
9 4 C X2 
+0

R 코딩에 대한 질문은 일반적으로 여기에서 주제가 아닙니다. 나는 이것이 [SO]에 관한 화제가 될 것이라고 생각한다. 기다리면 마이그레이션을 시도 할 수 있습니다. – gung

+0

죄송합니다. 마이그레이션 해 주셔서 감사합니다. –

+0

예상 출력을 표시 할 수 있습니까? – akrun

답변

0

data.table 패키지는 실제로

# Turn mydf into a data.table 
library(data.table) 
setDT(mydf) 

# Shuffle the rows of the table 
dt <- dt[sample(.N)] 

# In case there are multiple rows for a given Region <-> Site pair, 
# eliminate duplicates. 
dt <- unique(dt, by = c('Region', 'Site')) 

# Get the first sample from each region group 
# Note: .SD refers to the sub-tables after grouping by Region 
dt[, .SD[1], by=Region] 

# Get the second and third sample from each region group 
dt[, .SD[2], by=Region] 
dt[, .SD[3], by=Region] 

는 사실, 프랭크로 한 줄에 결합 할 수는

그것은 일
library(data.table) 
dt <- setDT(mydf) 
dt <- unique(dt, by = c('Region', 'Site')) 
dt[sample(.N), .SD[1:3], by = Region] 
+0

"중복 제거"단계는 '고유'로도 수행 할 수 있습니다. OP가 단지 지역 당 3 개의 사이트를 원하기 때문에 나중에 부분을 다시 말하자. 아마도'dt [, .SD [1 : 3], by = Region] '. 부수적으로 말하자면, 디버깅하기가 더 어렵 기 때문에'dt <-'를 덮어 쓰는 것은 나쁜 습관이라고 생각합니다. – Frank

+0

OP에 대한 명확성 강조. 하나의 라이너도 추가되었습니다. – andrew

+0

좋아, 멋진 한줄. Btw, 그냥 명확하게. 'dt <- dt [...]'는 코드를 덜 명확하게 만들었습니다. 왜냐하면 만약 그 단계 이전에'dt'가 어떻게 보이는지 알아 내고자한다면 위에서 코드를 다시 실행해야합니다. 더 단순한 것은'newdt <- dt [...]'입니다. 별도의 포인트 :'setDT'로, 할당 할 필요가 없습니다. 'mydf'는 reference에 의해 수정 된 data.table 그 자체가되었습니다. – Frank

0

제안이 아주 쉽게! 나는 대답을 받아들이 기위한 체크 표시가 보이지 않기 때문에 여기에서하고있다.

관련 문제