1

Rには、整数のベクトルのデータがあります。

run <- sample.int(9, 1000, replace=T)
run[sample.int(1000, 100)] <- NA

次のパターンの少なくとも1つ、またはc(1, x, 1, y)整数またはNAのいずれかが存在する場合は、各パターンの開始インデックスを出力し、パターンの各インスタンスのカウント変数を更新したいと思いますc(x, 1, y, 1)。これを行う最も効率的な方法は何ですか?xy

この関数を使用してrle、長さ1の4つの連続する値ごとにテストしてから、それらがパターンの1つに準拠しているかどうかをテストすることを考えていました。ただし、各NAは個別に処理されるため、このアプローチではNAに問題があります。おそらく、これを行うためのより良い方法があります。

4

2 に答える 2

3

sample.intベクトルにとからの値のみが含まれていることを意味するように使用する1:9NA、正規表現のアプローチは次のようになります。

run <- c(1, NA, 1, 3, 1, 1, NA, NA, NA, 1)
run[is.na(run)] <- 0
pat1 <- "(?=1[0-9]1[0-9])" # using a lookahead assertion around the pattern is a way to allow overlapping matches
pat1.idxs <- unlist(gregexpr(pat1, paste(run, collapse=''), perl=TRUE))
pat1.idxs
# match indexes
# [1] 1 3
length(pat1.idxs)
# counts
# [1] 2

次に、同様に2番目のパターンを実行します。

于 2012-12-08T11:05:38.300 に答える
2

この種のタスクは、パッケージのrollapply関数を使用して実行できます。zoo

set.seed(42)
run <- sample.int(9, 1000, replace=T)
run[sample.int(1000, 100)] <- NA

# a list of the patterns
pattern <- list(c(1, NA, 1, NA), c(NA, 1, NA, 1))

library(zoo)

colSums(rollapply(run, length(pattern[[1]]),
                  function(x) sapply(pattern, identical, x)))

pattern結果は、リスト内のパターンの数を含むベクトルです。

[1] 0 0

。パターンの長さが異なる場合は、rollapply複数回実行する必要がありました。

于 2012-12-08T08:45:15.463 に答える