2017-02-20 16 views
0

есть ли лучший и быстрый способ достижения нижеследующего? В принципе, я ищу (ищет) шаблон в кадре данных.pattern поиск по векторам в 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)

На основании этого я несу из другой трансформации позже. Каков идеальный и быстрый способ сделать это? приветствуется любое предложение.

+0

Может быть что-то вроде 'vapply (ДФ, функция (х) длина (пересекаются (х, рисунок)) == Длина (рисунок) , логический (1L)). – A5C1D2H2I1M1N2O1R2T1

+0

Используйте функцию 'map' из пакета' purrr' для эффективности: 'map (df, function (x) length (intersect (pattern, x)) == length (pattern))'. Вы также можете использовать базу «Карта»: «Карта (функция (x) length (intersect (pattern, x)) == length (pattern), df)'. – Abdou

+0

Thx. Но функция должна возвращать '[1] FALSE FALSE TRUE FALSE TRUE' для' pattern <- c (5,1,1) ', а не' [1] FALSE FALSE FALSE FALSE FALSE' –

ответ

0

Я собираюсь предположить, что вы имеете дело с положительными целыми числами. Решение, которое вы придумали на основе комментариев, неверно.

Пример:

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 

Вот функция, которая работает (где «работает» == «согласует выход существующей функции»). Он использует 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 
+0

Вы абсолютно правы. Я даю все условия, которым он должен следовать. Thax для того, чтобы взять тайм-аут и положить его полностью. Я бы проверил это на больших данных и дал вам производительность –