基于标识符的标记范围

问题描述:

这是基于我昨天提出的问题。它变得非常混乱,所以我再次尝试一个更清晰的问题。基于标识符的标记范围

我有一个很大的数据集。

>head(raw) 

ps cond pass sample stim gsr 
1 1 2 0  0 0 100 
2 1 2 0  1 0 100 
3 1 2 0  2 0 100 
4 1 2 0  3 0 100 
5 1 2 0  4 0 100 
6 1 2 0  5 0 100 

的$ STIM列由各个时期的编号1-11(每个周期持续20 $样品),用0较长的嵌段(持续140 $样品)。

对于每$ STIM == 10,I需要标记后续的范围:

例如,

计数(原始样品$ [原料$ PS == 1 &原料$ STIM == 10])#此1个主题数作为一个例子

 x freq 
1 1100 1 
2 1101 1 
3 1102 1 
4 1103 1 
5 1104 1 
6 1105 1 
7 1106 1 
8 1107 1 
9 1108 1 
10 1109 1 
11 1110 1 
12 1111 1 
13 1112 1 
14 1113 1 
15 1114 1 
16 1115 1 
17 1116 1 
18 1117 1 
19 1118 1 
20 1119 1 

所以我想范围的开头STIM $ == 10的最后一个单元格后,启动10个细胞(在本例中为1119 ,所以我们从1120开始。我们需要从这个地方算起10: 1130.范围的末尾是从1130 = 1180开始的50美元的样本。

所以。我想我需要的是在我的原始文件中添加一个新列,它标记TRUE在分析中使用的单元格。在上面的例子中,它们是$ sample == 1130和1180之间的范围。

我不想亲自去经过。我正在寻找一种更为自动化的方式来勾选范围。

我希望现在更清楚我的目标是什么?

进一步的信息:由于前一个错误

> sort(unique(rle(raw$n.filter)$length)) 
40 50 590 1080 1130 1240 1400 1560 1720 1880 2030 2040 2200 2360 

> summary(raw$stim) 
    0  1  2  3  4  5  6  7  8  9  10  11 
286440 3720 3720 3720 3720 3720 3720 3720 3720 3720 3720 3720 

> summary(raw$stim[raw$ps==1]) 
    0 1 2 3 4 5 6 7 8 9 10 11 
1540 20 20 20 20 20 20 20 20 20 20 20 

> summary(raw$stim[raw$ps==186]) 
    0 1 2 3 4 5 6 7 8 9 10 11 
1540 20 20 20 20 20 20 20 20 20 20 20 

编辑答案:

有得到你想要的东西有两种方式。一种方法是矢量化(快速),另一种方法是循环并且速度慢。

1.Vectorized:

tmp <- which(raw$stim == 10) 
ltmp <- 1:length(tmp) 

raw$n.filter <- FALSE 
raw[tmp + 30,"n.filter"] <- TRUE 
raw[tmp + 50,"n.filter"] <- TRUE 
raw[tmp[ltmp[(ltmp%%20) > 0 & (ltmp%%20) < 11]]+70,"n.filter"] <- TRUE 
rle(raw$n.filter) 

2.采用循环:

raw$n.filter <- FALSE 

for (counter in 2:(nrow(raw))) { 
    if ((raw[counter-1, "stim"] == 10) & raw[counter, "stim"] != 10) raw[(counter+10):(counter+59),"n.filter"] <- TRUE 
} 

rle(raw$n.filter) 

我才懒得等待循环的版本来完成。它是最好复制一个版本的结果,然后运行另一个版本并查看它们是否为all.equal()

+0

@Henrik关闭,但不完全!它似乎在stim == 10之后选择了40。我会进一步研究你的代码,看看我能否适应它。非常感谢您的帮助。 – 2011-04-12 14:28:17

+0

嗯,这听起来不太可能。在c()中的'[]'中的代码应该返回长度为50的向量,如果stim == 10的序列每个长度为20。 如果有的话,您的评论表明这个'c()'序列的第三部分不起作用。 – Henrik 2011-04-12 14:33:57

+0

@Henrik。我的错。我输入了错误的值。我认为你是在做我所问的,而不是我需要的。我的错。我会看看我能否适应你的需求。 – 2011-04-12 14:44:52