Нахождение повторяющихся паттернов в R - PullRequest
1 голос
/ 06 января 2011

Скажем, у меня есть матрица из 5 х 100 чисел от 0 до 100, например:

1   5   10  15  3
2   15  3   8   27
1   22  34  45  35
28  27  32  3   8
......

Я хотел бы найти повторяющиеся "шаблоны" чисел (в основном, пары или тройки).

Таким образом, в моем примере пара 3,15 должна появиться дважды, а триплет 3, 8, 27 также появится дважды (мне безразличен порядок).

Как бы вы реализоваличто в R?

я хотел бы иметь пары и тройки отдельно и иметь их количество.

спасибо nico

1 Ответ

3 голосов
/ 06 января 2011

Вот один из способов. Для каждой строки вашей матрицы из 100 строк вы найдете все пары / тройки чисел (используя combn) и выполните подсчет частоты (используя table) пар / тройок. Определенная мной функция pasteSort создает строку из вектора после ее сортировки. Мы применяем эту функцию к каждой паре / кортежу в каждой строке и собираем все пары / кортежи из матрицы перед выполнением подсчета частоты. Обратите внимание, что если пара повторяется в той же строке , она считается "повторением".

> mtx <- matrix( c(1,5,10,15,3, 
                 2, 15, 3, 8, 27, 
                 1, 22, 34, 45, 35, 
                  28, 27, 32, 3, 8), ncol=5, byrow=TRUE)
> pasteSort <- function( x ) do.call(paste, as.list( sort( x) ) )
> pairs <- c( apply(mtx, 1, function(row) apply( combn(row, 2), 2, pasteSort)) )
> pairFreqs <- table(pairs)
> pairFreqs[ pairFreqs > 1 ]
3 15 3 27  3 8 8 27 
   2    2    2    2 
> triples <- c( apply(mtx, 1, function(row) apply( combn(row, 3), 2, pasteSort)) )
> tripleFreqs <- table( triples )
> tripleFreqs[ tripleFreqs > 1 ]
3 8 27 
     2 
...