2011-01-06 2 views
1

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

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

ответ

3

Вот один из способов. Для каждой строки вашей 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 
+0

'combn'! Это то, чего мне не хватало! Я попробую это сегодня вечером, и я скажу вам, если это сработает! (PS: числа не могут быть повторены в одной строке, так что это не проблема). – nico

+0

работает отлично! благодаря! – nico

+0

@nico приветствуются –

Смежные вопросы