Отметить диапазон на основе идентификатора - PullRequest
1 голос
/ 12 апреля 2011

Это основано на вопросе, который я задал вчера.Это стало очень запутанным, поэтому я пытаюсь снова с более ясным вопросом.

У меня большой набор данных.

>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   

Столбец $ стимул состоит из различных периодов, пронумерованных 1-11 (каждый период длится 20 $ выборки), с более длинными блоками 0 (продолжительностью 140 $ выборка).

Для каждого $tim == 10 мне нужно отметить следующий диапазон:

например,

count (raw $ sample [raw $ ps == 1 & raw $ стим = == 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

Так что я хочу, чтобы начало диапазона начиналось через 10 ячеек после последней ячейки с $ activ == 10 (в этомНапример, это 1119, поэтому мы начинаем с 1120. Нам нужно посчитать 10 с этого места: 1130. Конец диапазона составляет 50 $ выборки из 1130 = 1180.

Итак.Мне кажется, мне нужен новый столбец в моем необработанном файле, который помечает ИСТИНА для тех ячеек, которые будут использоваться в анализе. В приведенном выше примере они будут находиться в диапазоне между $ sample == 1130 и 1180.

Я не хочу проходить вручную. Я ищу более автоматизированный способ помечать диапазоны.

Надеюсь, теперь стало яснее, чем я являюсьiming for?

Дополнительная информация:

> 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 Ответ

1 голос
/ 12 апреля 2011

Отредактированный ответ из-за ошибки в предыдущем:

Есть два способа получить то, что вы хотите.Один путь векторизован (и быстр), другой - с петлей и медленно.

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

...