2013-05-06 86 views
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> 

440在每个块[[I]]行。

目前,我的脚本每15个试验中就有一个随机选择一个项目(每个110除前5个试验外,我还设置了所以我不能选择小于2的行) [一世]]。

我希望能够做的是做的东西从每15个审判中的1项,从响应==“d”的那些随机选出的。即,我不希望我的随机选择对响应==“s”的行执行任何操作。我不知道如何实现这一点,但这里是剧本我到目前为止,这只是随机选择1排出来的每个15:

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个“连续响应!卫生署。能很好的解决这个问题,但对于我需要的东西来说没问题,当我被卡住时,我只是再次运行它(d/s的位置是随机生成的)。

回答

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... 
+0

这是我想要的一步,不同的是我想每15分钟拿一个样本,例如如果我的随机不落在一个d我重绘,直到我得到一个 – luke123 2013-05-07 03:33:45

+0

看看这个更新是否适合你。 – Thomas 2013-05-07 06:52:42

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

上面的内容可以简化/删除很多,但它应该完成工作。

+0

余数为空时会发生什么?看起来你会'抽样'向量'1:0'。 – Frank 2013-05-06 14:10:29

+1

这里基本上没有错误或边界检查。如果您选择了多个响应,您将得到错误的输出(R会提供警告,但仍然运行)。如果你有一个余数为2的行,碰巧彼此相邻,函数将永远运行。在生产中使用它是一个坏主意(TM)。 :) – 2013-05-06 14:15:49