2013-05-06 4 views
0

I가 [I] 블록 데이터가 행들의 서브 세트로부터 선택 어디 = 4 각 블록 [I] 너무무작위

Stimulus Response PM 
    stretagost  s <NA> 
    colpublo  s <NA> 
    zoning   d <NA> 
    epilepsy  d <NA> 
    resumption  d <NA> 
    incisive  d <NA> 

440 행을 추천한다.

현재 내 스크립트는 매 블록마다 처음으로 5 번 시도 (110 번 시도를 제외하고는 1 번 시도를 제외하고는 2 번 미만의 행을 결코 선택할 수 없음)을 제외한 모든 15 가지 시도 중에서 1 번 항목을 무작위로 선택합니다 [ [나는]].

내가 할 수 있기를 원하는 것은 응답 == "d"인 경우에만 무작위로 추출한 15 번의 모든 시도에서 1 개 항목을 처리하는 것입니다. 즉, 무작위로 선택한 항목이 응답 == "s"인 행에 물건을 넣는 것을 원하지 않습니다. 나는 이것을 달성하는 방법을 아무 생각하지만, 여기에 단지 무작위로 각각 15 중 1 개 행을 선택합니다 내가 지금까지 가지고있는 스크립트입니다 : 내가 그렇게

PMpositions <- list() 
for (i in 1:3){ 
startingpositions <- c(seq(5, 110-15, 15),seq(115, 220-15, 15),seq(225, 330-15,  
15),seq(335, 440-15, 15)) 
positions <- c() 
x <- 0 
for (j in startingpositions) 
{ 
sub.samples <- setdiff(1:15 + j, seq(x-2,x+2,1)) 
x <- sample(sub.samples, 1) 
positions <- c(positions,x) 
} 
repeat { 
positions[which(blocks[[i]][positions,2]==Nonwordresponse)]<- 
startingpositions[which(blocks[[i]][positions,2]==Nonwordresponse)]+sample(1:15, 
size=length(which(blocks[[i]][positions,2]==Nonwordresponse)), replace = TRUE) 
distancecheck<- which (abs(c(positions[2:length(positions)],0)-positions) < 2) 
if (length(positions[which(blocks[[i]][positions,2]==Nonwordresponse)])== 0 & length 
(distancecheck)== 0) break 
} 
PMpositions[[i]] <- positions 
blocks[[i]]$Response[PMpositions[[i]]] <- Wordresponse 
blocks[[i]]$PM[PMpositions[[i]]] <- PMresponse 
blocks[[i]][PMpositions[[i]],]$Stimulus <- as.character(NF[[i]][,1]) 
Nonfocal[[i]] <- blocks[[i]] 
} 
처럼 다루는 결국

PMpositions <- list() 
for (i in 4:6){ 
    positions <- c() 
    x <- 0 
    for (j in c(seq(5, 110-15, 15),seq(115, 220-15, 15),seq(225, 330-15, 15),seq(335,440-15, 15))) 
    { 
    sub.samples <- setdiff(1:15 + j, seq(x-2,x+2,1)) 
    x <- sample(sub.samples, 1) 
    positions <- c(positions,x) 
    } 
    PMpositions[[i]] <- positions 
    blocks[[i]]$Response[PMpositions[[i]]] <- Wordresponse 
    blocks[[i]]$PM[PMpositions[[i]]] <- PMresponse 
    blocks[[i]][PMpositions[[i]],]$Stimulus <- F[[i]] 
} 

반복 루프에서 멈추는 경우가 종종 있는데, 연속적으로 15 "s"가 나타납니다. doh. 이 문제를 해결할 수 있으면 좋겠지 만, 내가 필요로하는 부분에 대해서는 괜찮습니다. 멈추었을 때 나는 다시 실행합니다 (d/s의 위치는 무작위로 생성됩니다).

답변

1

편집 : 다음은 'd'행만 샘플링하는 다른 접근 방식입니다. 이것은 꽤 사용자 정의 된 코드이지만, 주된 아이디어는 prob 인수를 사용하여 "Response"== "d"인 행을 샘플링하고 다른 모든 행을 샘플링하는 것을 0으로 설정하는 것입니다.

Response <- rep(c("s","d"),220) 
chunk <- sort(rep(1:30,15))[1:440] # chunks of 15 up to 440 

# function to randomly sample from each set of 15 rows 
sampby15 <- function(i){ 
    sample((1:440)[chunk==i], 1, 
     # use the `prob` argument to only sample 'd' values 
     prob=rep(1,length=440)[chunk==i]*(Response=="d")[chunk==i]) 
} 
s <- sapply(1:15,FUN=sampby15) # apply to each chunk to get sample rows 
Response[s] # confirm only 'd' values 

# then you have code to do whatever to those rows... 
+0

그게 내가 원하는 것을 향한 단계입니다. 차이점은 15 개마다 1 개 샘플을 가져 가고 싶다는 것입니다. 내 무작위로 d에 도착하지 않을 경우 다시 그리다. – luke123

+0

이 업데이트가 적용되는지 확인하십시오. – Thomas

1

은 그래서 당신은 각 블록에서 작동 할 수 있습니다 정말 기본 기능은 다음과 같이이다 :

subsetminor <- function(dataset, only = "d", rows = 1) { 
    remainder <- subset(dataset, Response == only) 
    return(remainder[sample(1:nrow(remainder), size = rows), ]) 
} 

우리는 서로 옆에 행을 피하기 위해 약간을 단장 할 수 있습니다

subsetminor <- function(dataset, only = "d", rows = 1) { 
    remainder <- subset(dataset, Response == only) 
    if(rows > 1) { 
    sampled <- sample(1:nrow(remainder), size = rows) 
    pairwise <- t(combn(sampled, 2)) 
    while(any(abs(pairwise[, 1] - pairwise[, 2]) <= 2)) { 
     sampled <- sample(1:nrow(remainder), size = rows) 
     pairwise <- t(combn(sampled, 2)) 
    } 
    } 
    out <- remainder[sampled, ] 
    return(out) 
} 

위의 내용은 간단하게 정리할 수 있지만 DRY는 상당히 어려울 수 있지만 작업을 완료해야합니다.

+0

나머지가 비어 있으면 어떻게됩니까? 벡터'1 : 0'을 '샘플링'하는 것처럼 보입니다. – Frank

+1

기본적으로 여기에는 오류 또는 경계가 확인되지 않습니다. 둘 이상의 응답을 선택하면 잘못된 출력을 얻습니다 (R은 경고를 제공하지만 계속 실행 됨). 서로 옆에있는 2 행 길이가 나머지라면 함수는 영원히 돌아갈 것입니다. 프로덕션 환경에서이를 사용하는 것은 좋지 않은 아이디어입니다 (TM). :) –

관련 문제