R 基于标识符的标记范围

R 基于标识符的标记范围,r,range,extract,R,Range,Extract,这是基于我昨天问的一个问题。它变得非常混乱,所以我再次尝试提出一个更清晰的问题 我有一个很大的数据集 >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

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

我有一个很大的数据集

>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,我需要标记一个后续范围:

e、 g

计数(raw$sample[raw$ps==1&raw$stim==10])#以1个主题为例

因此,我希望范围的开始从$stim==10的最后一个单元格之后的10个单元格开始(在本例中,它是1119,所以我们从1120开始。我们需要从这个位置开始计算10:1130。范围的结束是从1130=1180开始的50$sample

所以,我想我需要的是在我的原始文件中创建一个新列,它将在分析中使用的单元格标记为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)

tmp由于上一个错误而编辑了答案:

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

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)

tmp@Henrik关闭,但不完全关闭!它似乎在stim==10之后选择了40。我将进一步研究您的代码,看看是否可以修改。非常感谢您的帮助。嗯,这听起来不太可能。
[]
中的代码在
c()中
如果stim==10的序列长度各为20,则应返回长度为50的向量。如果有任何问题,您的注释表明此
c()的第三部分
sequence不起作用。@Henrik。我的错。我输入了错误的值。我想你的方法是按照我的要求做的,而不是按照我的需要做的。我的错。我会看看我是否能使你的方法适应我的需要。@RSoul。请注意,我的版本只有在每次stim==10的运行时间相等时才起作用。如果不行,整个方法都不起作用,你需要使用循环。请致电l如果需要,请告诉我,我会相应地编辑我的答案。@r我的初始版本中有一个错误。现在应该可以了。@Henrik Close,但不完全正确!它似乎在stim==10之后选择了40。我将进一步查看您的代码,看看是否可以修改它。非常感谢您的帮助。嗯,这听起来不太可能。
[]中的代码
如果stim==10的序列长度各为20,则
c()中的
应返回长度为50的向量。如果有任何问题,您的注释表明此
c()的第三部分
sequence不起作用。@Henrik。我的错。我输入了错误的值。我想你的方法是按照我的要求做的,而不是按照我的需要做的。我的错。我会看看我是否能使你的方法适应我的需要。@RSoul。请注意,我的版本只有在每次stim==10的运行时间相等时才起作用。如果不行,整个方法都不起作用,你需要使用循环。请致电l如果需要,请告诉我,我会相应地编辑我的答案。@r我的初始版本有错误。现在应该可以了。
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)