如何匹配R中的简单交替模式列表

时间:2012-12-08 08:34:11

标签: r pattern-matching

在R中,我有一个整数向量的数据。

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

如果存在以下至少一种模式,c(1, x, 1, y)c(x, 1, y, 1) xy是整数或NA,我想打印输出每个模式的起始索引,并为模式的每个实例更新计数变量。这样做最有效的方法是什么?

我正在考虑使用rle函数并测试长度为1的每4个连续值,然后测试它们是否符合其中一个模式。但是,由于每个NA都是单独处理的,因此我使用这种方法遇到了NA问题。也许有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分: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

然后你会同样做第二种模式。

答案 1 :(得分: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必须多次执行。