2011-04-12 7 views
1

이것은 어제 물어 본 질문에 근거합니다. 그것은 매우 혼란스러워서, 나는 더 명확한 질문으로 다시 노력하고 있습니다.식별자에 기반한 표식 범위

큰 데이터 세트가 있습니다. 하여 $ STIM 열 다양한 기간으로 구성된다

>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 

은 ($ 140의 샘플 지속) 0의 긴 블록 (각 기간 20 $ 샘플 지속) 1-11 번째. == 예

(원시 $ 샘플 [원료 $ 추신 == 1 & 원료 $의 STIM

횟수 : 모든 $ STIM == 10

는 I 후속 범위를 표시해야 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입니다 예를 들어 한 주제에 대한 카운트를 #이 , 그래서 여기에서 10을 세어야합니다 : 1130입니다. 범위의 끝은 1130 = 1180의 50 $ 샘플입니다.

So. 필자가 생각하기에 원시 파일의 새 열에 대해서는 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

편집 답 : 당신이 원하는 것을 얻는 두 가지 방법이 있습니다

. 한 가지 방법은 벡터화 (및 빠른), 다른 하나는 루프 및 느린 것입니다.

1.Vectorized :

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.With 루프 :

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()인지 확인하는 것이 가장 좋습니다.

+0

@Henrik 닫기, 아니지만 아주! 그것은 자극 == 10 후에 40을 선택하는 것 같습니다. 코드를 자세히 살펴보고이를 적용 할 수 있는지 확인합니다. 많은 도움에 감사드립니다. –

+0

흠, 그럴 것 같지 않습니다. 'c()'내의'[]'에있는 코드는 stim = 10의 순서가 각각 20 길다면 길이가 50 인 벡터를 반환해야합니다. 당신의 의견은이'c()'시퀀스의 세 번째 부분이 작동하지 않는다고 제안합니다. – Henrik

+0

@Henrik. 내 잘못이야. 나는 잘못된 값을 넣었다. 나는 네가 요구 한 것을하고 있다고 생각한다. 내가 필요로하는 것이 아니다. 내 잘못. 내가 너를 나의 필요에 적응시킬 수 있는지 알게 될 것이다. –

관련 문제