2011-04-12 111 views
1

這是基於我昨天提出的問題。它變得非常混亂,所以我再次嘗試一個更清晰的問題。基於標識符的標記範圍

我有一個很大的數據集。

>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 $樣品),用0較長的嵌段(持續140 $樣品)。

對於每$ STIM == 10,I需要標記後續的範圍:

例如,

計數(原始樣品$ [原料$ PS == 1 &原料$ STIM == 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 

所以我想範圍的開頭STIM $ == 10的最後一個單元格後,啓動10個細胞(在本例中爲1119 ,所以我們從1120開始。我們需要從這個地方算起10: 1130.範圍的末尾是從1130 = 1180開始的50美元的樣本。

所以。我想我需要的是在我的原始文件中添加一個新列,它標記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.採用循環:

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關閉,但不完全!它似乎在stim == 10之後選擇了40。我會進一步研究你的代碼,看看我能否適應它。非常感謝您的幫助。 – 2011-04-12 14:28:17

+0

嗯,這聽起來不太可能。在c()中的'[]'中的代碼應該返回長度爲50的向量,如果stim == 10的序列每個長度爲20。 如果有的話,您的評論表明這個'c()'序列的第三部分不起作用。 – Henrik 2011-04-12 14:33:57

+0

@Henrik。我的錯。我輸入了錯誤的值。我認爲你是在做我所問的,而不是我需要的。我的錯。我會看看我能否適應你的需求。 – 2011-04-12 14:44:52