[英]pattern search on vectors in R
有沒有更好,更快的方法來實現以下目標? 基本上,我正在尋找(搜索)數據框中的模式。
以下對我有用。 但是我無法擴展。 時間復雜度確實是我關注的問題。
searchPattern <- function(ls, pattern){
sapply(ls, function(x) {
tmp <- all(table(x)[names(table(pattern))]>=table(pattern))
ifelse(is.na(tmp),FALSE,tmp)
})
}
pattern <- c(5,1)
df <- list(1,c(1,7,4,5),c(6,5,1,1),5:10,c(5,5,1,1))
df
searchPattern(df,pattern)
結果是一個邏輯向量:
[1] FALSE TRUE TRUE FALSE TRUE
此示例中的模式僅為c(5,1)
,但將其循環以獲取不同的模式,例如1,c(1,7,4,5),c(6,5,1,1),5:10,c(5,5,1,1)
基於此,我稍后將進行其他轉換。 什么是理想且更快的方法? 任何建議表示贊賞。
我將假設您正在處理正整數。 您基於注釋提出的解決方案不正確。
例:
x <- c(5, 1, 1)
test <- list(c(1, 5, 1, 1), c(1, 5), c(5, 1, 1), c(6, 1, 6, 5, 1, 5), c(1, 1, 1))
rec <- function(ll, patt) vapply(ll, function(x) sum(x %in% patt) >= length(patt), logical(1L))
rec(test, x)
## [1] TRUE FALSE TRUE TRUE TRUE
這是一個有效的函數(其中“ works” ==“匹配現有函數的輸出”)。 它使用tabulate
代替table
,這可能要快得多。
sp <- function(ll, patt) {
xt <- tabulate(patt)
xu <- unique(patt)
vapply(ll, function(z) all(tabulate(z, max(xu))[xu] >= xt[xu]), logical(1L))
}
sp(test, x)
## [1] TRUE FALSE TRUE TRUE FALSE
在更大的物體上進行測試:
set.seed(2)
y <- replicate(100, sample(8, sample(4:10, 1), TRUE), FALSE)
x <- c(5, 1, 1)
library(microbenchmark)
microbenchmark(sp(y, x), searchPattern(y, x))
## Unit: microseconds
## expr min lq mean median uq max neval
## sp(y, x) 267.134 295.096 312.9538 311.1815 323.369 485.269 100
## searchPattern(y, x) 24709.732 25218.143 26663.5091 25737.1475 28478.559 31324.695 100
identical(sp(y, x), searchPattern(y, x))
## [1] TRUE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.