在R中,我有一个整数向量的数据。
run <- sample.int(9, 1000, replace=T)
run[sample.int(1000, 100)] <- NA
如果存在以下至少一种模式,c(1, x, 1, y)
或c(x, 1, y, 1)
x
和y
是整数或NA,我想打印输出每个模式的起始索引,并为模式的每个实例更新计数变量。这样做最有效的方法是什么?
我正在考虑使用rle
函数并测试长度为1的每4个连续值,然后测试它们是否符合其中一个模式。但是,由于每个NA都是单独处理的,因此我使用这种方法遇到了NA问题。也许有更好的方法来做到这一点。
答案 0 :(得分:3)
使用sample.int
暗示您的向量仅包含来自1:9
和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
然后你会同样做第二种模式。
答案 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
必须多次执行。