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)