簡體   English   中英

R中向量的模式搜索

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM