0

我在 blocks[[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]] .

我想要做的是从每 15 次试验中对 1 项进行处理,仅从响应 ==“d”的那些中随机选择。即,我不希望我的随机选择对 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

编辑:这是一种仅对“d”行进行采样的不同方法。这是非常定制的代码,但主要思想是使用prob参数仅对 "Response"=="d" 的行进行采样,并将所有其他行的采样概率设置为零。

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...
于 2013-05-06T13:50:51.720 回答
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)
}

上面可以简化/干掉很多,但它应该可以完成工作。

于 2013-05-06T14:04:39.960 回答