r语言 - 基于标识符标记范围



这是基于我昨天问的一个问题。它变得很混乱,所以我用一个更清晰的问题再试一次。

我有一个大数据集。

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

相关内容

  • 没有找到相关文章

最新更新