0

ブロック [[i]] にデータがあります。i = 4 から 6 のように

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

各ブロック [[i]] に 440 行。

現在、私のスクリプトは、ブロックごとに 15 回の試行ごとにランダムに選択された 1 つのアイテムに対して何らかの処理を行っています (110 回ごとの最初の 5 回の試行を除き、2 つ未満の行を選択できないように設定しています) [[i]] .

私ができるようにしたいのは、response == "d" の項目のみからランダムに選択された、15 回の試行ごとに 1 つの項目に対して処理を行うことです。つまり、response=="s" の行に対してランダムな選択が行われることは望ましくありません。これを達成する方法はわかりませんが、これまでに作成したスクリプトは次のとおりです。これは、15 行ごとにランダムに 1 行を選択するだけです。

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]]
}

私はそれをそのように扱った

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]]
}

繰り返しループに行き詰まったときに、15 個の「s」が連続して返される場合があることに気付きました。ああ。これを修正できればいいのですが、必要なものは問題ありません。行き詰まったら、もう一度実行します(d / sの場所はランダムに生成されます)。

4

2 に答える 2

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できますが、仕事は完了するはずです。

于 2013-05-06T14:04:39.960 に答える