5

別の質問から発展する:

Rで繰り返される番号のシーケンスを識別する

私はその質問の回答を使用してデータ内のシーケンスを識別しましたが、問題はありませんが、異なる番号のシーケンスを識別することに関しては行き詰まっています。たとえば、シーケンスは次のようになります。

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

サンプルデータ:

   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)

ただし、異なる番号を含むシーケンスを識別する方法がわかりません。たとえば、シーケンスは次のようになります。「2012-10-0109:11:00」の1,2,2,1(d $ Aerialなど)

さまざまなパターンがあります。データは、特定の空中線での特定の時間における信号の検出ですが、質問を開いたままにするために、上記のように簡略化しました。したがって、パターンは1,2,2,1です。つまり、Aerial 1、2、2、1の順に検出されます(Aerial列)。私のデータでは、このパターンが発生すると、動物の行動の動きを示します。それを特定できれば、さらに計算を実行できます。

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

このシーケンス(1,2,2,1)はデータに複数回出現する可能性があるため、毎回識別したいと思います。

4

2 に答える 2

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

zoorollapplyこれに使用できるものがあります:

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
于 2013-03-10T23:42:08.427 に答える
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

次に、これらを Matthew Lundberg の回答に入力できます。

于 2013-03-10T23:55:30.093 に答える