基于标识符的标记范围
问题描述:
这是基于我昨天提出的问题。它变得非常混乱,所以我再次尝试一个更清晰的问题。基于标识符的标记范围
我有一个很大的数据集。
>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()
。
@Henrik关闭,但不完全!它似乎在stim == 10之后选择了40。我会进一步研究你的代码,看看我能否适应它。非常感谢您的帮助。 – 2011-04-12 14:28:17
嗯,这听起来不太可能。在c()中的'[]'中的代码应该返回长度为50的向量,如果stim == 10的序列每个长度为20。 如果有的话,您的评论表明这个'c()'序列的第三部分不起作用。 – Henrik 2011-04-12 14:33:57
@Henrik。我的错。我输入了错误的值。我认为你是在做我所问的,而不是我需要的。我的错。我会看看我能否适应你的需求。 – 2011-04-12 14:44:52