2013-03-10 14 views
5

別の質問から上の現像:私はそれが配列を同定することになるとしかし、私は立ち往生午前、ない問題、私のデータ内の配列を同定するために、その質問から回答を使用していた番号配列認識

Identifying sequences of repeated numbers in R

例については、異なる数:多分シーケンス:繰り返しの数字よりもむしろ126,126,25、

私が現在使用しているコードは、上記の質問の場合と同じである(RLE)

サンプルD ATA:数字の繰り返し配列を認識します

d<-read.table(text='Date.Time Aerial 
794 "2012-10-01 08:18:00"  1 
795 "2012-10-01 08:34:00"  1 
796 "2012-10-01 08:39:00"  1 
797 "2012-10-01 08:42:00"  1 
798 "2012-10-01 08:48:00"  1 
799 "2012-10-01 08:54:00"  1 
800 "2012-10-01 08:58:00"  1 
801 "2012-10-01 09:04:00"  1 
802 "2012-10-01 09:05:00"  1 
803 "2012-10-01 09:11:00"  1 
1576 "2012-10-01 09:17:00"  2 
1577 "2012-10-01 09:18:00"  2 
804 "2012-10-01 09:19:00"  1 
805 "2012-10-01 09:20:00"  1 
1580 "2012-10-01 09:21:00"  2 
1581 "2012-10-01 09:23:00"  2 
806 "2012-10-01 09:25:00"  1 
807 "2012-10-01 09:32:00"  1 
808 "2012-10-01 09:37:00"  1 
809 "2012-10-01 09:43:00"  1', header=TRUE, stringsAsFactors=FALSE, row.names=1) 

コードは(同じ番号が繰り返し4回):

tmp <- rle(d$Aerial) 
d$newCol <- rep(tmp$lengths>=4, times = tmp$lengths) 

は、しかし、私には、例えば、異なる番号が含まれている配列を同定する方法がわかりませんシーケンスは:1,2,2,1(d $ Aerialのように) "2012-10-01 09:11:00"

さまざまなパターンがあります。データは与えられた空中線上のある時刻の信号の検出ですが、質問を開いたままにするために私は上記のように単純化しました。パターンは1,2,2,1、すなわち空中1、次に2、次に、2、次いで1(空中列)で検出される。このパターンが発生したときの私のデータでは、動物の行動の動きを示しています。私がそれを特定できれば、もっと計算をすることができます。

上記のコードでは、しかし、互いに異なる4つの数字の繰り返しを識別することができない、数が4回繰り返される場合を示している:1,2,2,1

この配列(1,2- 、2,1)がデータに複数回出現する可能性があり、毎回それを特定したいと考えています。

+2

あなたの質問はまだ私には分かりません。適切な例を使って詳しいことを教えてください...そしてそれはその投稿とどう違うのですか?あなたは良い答えが期待されるなら、あなたの質問を定式化するためにあなたは*本当に時間を取るべきです*。 – Arun

+0

お詫び申し上げます。 –

+0

あなたが解決しようとしている問題の説明が、物事を明確にするのに役立つかもしれません...あなたが探しているパターンがありますか?どのようにそれらを決定するのですか? – Justin

答えて

4

ブルートフォースソリューション:

pat <- c(1,2,2,1) 
x <- sapply(1:(nrow(d)-length(pat)), function(x) all(d$Aerial[x:(x+length(pat)-1)] == pat)) 

d[which(x),] # "which" prevents recycling of the shorter vector "x" 
##    Date.Time Aerial 
## 803 2012-10-01 09:11:00  1 
## 805 2012-10-01 09:20:00  1 

zooはこのために使用することができますrollapplyを持っています(現在は削除)コメントを

require(zoo) 
x <- rollapply(d$Aerial, length(pat), FUN=function(x) all(x == pat)) 

d[which(x),] 
##    Date.Time Aerial 
## 803 2012-10-01 09:11:00  1 
## 805 2012-10-01 09:20:00  1 

、最後の文字に一致する行を見つけるために、パターンの種類:

d[which(x)+length(pat)-1,] 
##    Date.Time Aerial 
## 804 2012-10-01 09:19:00  1 
## 806 2012-10-01 09:25:00  1 
+0

@Salmosalar私は編集します。 –

4

パターンが何であるかわからない場合は

pattern_length = 4 
patterns = list() 
for (i in 1:(nrow(d) - pattern_length)) { 
    patterns[[i]] = d$Aerial[i:(i + pattern_length - 1)] 
} 
unique(patterns[duplicated(patterns)]) 

[[1]] 
[1] 1 1 1 1 

[[2]] 
[1] 1 1 2 2 

[[3]] 
[1] 1 2 2 1 

[[4]] 
[1] 2 2 1 1 

あなたはその後、マシュー・ランドバーグの答えの中にこれらを供給できます(私は最初にあなたの質問から取ったものですもの)事前にになるだろうし、ここで指定された長さの繰り返しパターンを見つけるブルートフォースソリューションです。

+0

ああ、私は見る!ありがとう、はい私はすでにパターンが特定の動作を意味するので、パターンを知っています! –

関連する問題