1

在 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函数并测试每 4 个长度为 1 的连续值,然后测试它们是否符合其中一种模式。但是,我在使用这种方法时遇到了 NA 问题,因为每个 NA 都是单独处理的。也许有更好的方法来做到这一点。

4

2 回答 2

3

将您的使用sample.int视为暗示您的向量仅包含来自1:9and的值NA,这是一种正则表达式方法:

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

然后你会类似地做第二种模式。

于 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 回答