这是基于我昨天问的一个问题。它变得很混乱,所以我用一个更清晰的问题再试一次。
我有一个大数据集。
>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 $sample),较长的0块(持续140 $sample)。
对于每个$stim==10,我需要标记一个后续范围:
。
计数(生$样本[生ps = = 1美元,Raw $stim==10]) #这作为一个例子
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。范围的下限是50美元,从1130 = 1180。
。我认为我需要的是在我的原始文件中添加一个新列,它标记为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。矢量化:
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()
。