определить частоту общего шаблона из числа целых чисел - PullRequest
0 голосов
/ 07 октября 2018

У меня много строк целых чисел с 7 столбцами в каждой, это некоторые биологические точки, записанные из эксперимента.Числа только от 1 до 7, и я хотел бы определить общий шаблон этих целых чисел.

first few rows of df:

        [,1] [,2] [,3] [,4] [,5] [,6] [,7]
   [1,]    1    2    3    4    6    7    7
   [2,]    1    2    2    3    3    5    7
   [3,]    1    2    2    3    3    4    5
   [4,]    2    3    4    7    7    7    7
   [5,]    1    1    3    4    5    6    7
   [6,]    2    2    3    3    4    6    6
   [7,]    1    1    2    3    3    6    6
   [8,]    2    2    3    4    6    6    7
   ...

для экземпляров,

desired output:

pattern freq
1 2 3 4 1
2 3 4 6 2
1 2 3   4
2 2 3   4
...
...

Пожалуйста, совет, спасибо.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Для каждой длины последовательности мы вызываем freqs, что для каждой строки m вызывает rollapply для получения последовательных подпоследовательностей.ag содержит каждую подпоследовательность вместе с ее частотой, и, наконец, мы опускаем подпоследовательности, не имеющие минимальной частоты minFreq, чтобы уменьшить размер.

В последней строке кода мы последовательно вызываем freqs со значениями k (длина подпоследовательности) для 4, 3, 2 и 1, чтобы получить подпоследовательности этих длин.Измените 4: 1 на то, что вы хотите.Также в этой строке опустите minFreq=2, если вы хотите, чтобы все частоты, а не только те, которые были как минимум 2. (Мы использовали по крайней мере 2, чтобы сохранить выходной размер разумным.)

library(plyr)
library(zoo)

freqs <- function(k, m, minFreq = 1) {
  tuples <- if (k == 1) matrix(m) 
    else do.call("rbind", lapply(split(m, row(m)), rollapply, k, c))
  ag <- aggregate(list(freq = 1:nrow(tuples)), as.data.frame(tuples), length)
  subset(ag, freq >= minFreq)
}

do.call("rbind.fill", lapply(4:1, freqs, m, minFreq = 2))

, давая:

   V1 V2 V3 V4 freq
1   1  2  2  3    2
2   2  2  3  3    3
3   2  3  3  4    2
4   2  3  4  6    2
5   3  4  6  6    2
6   1  2  2 NA    2
7   1  2  3 NA    2
8   2  2  3 NA    4
9   2  3  3 NA    4
10  2  3  4 NA    3
11  3  3  4 NA    2
12  3  4  5 NA    2
13  3  4  6 NA    3
14  4  6  6 NA    2
15  7  7  7 NA    2
16  1  1 NA NA    2
17  1  2 NA NA    4
18  2  2 NA NA    4
19  2  3 NA NA    7
20  3  3 NA NA    4
21  3  4 NA NA    6
22  4  5 NA NA    2
23  4  6 NA NA    3
24  6  6 NA NA    3
25  6  7 NA NA    3
26  7  7 NA NA    4
27  1 NA NA NA    7
28  2 NA NA NA   11
29  3 NA NA NA   12
30  4 NA NA NA    6
31  5 NA NA NA    3
32  6 NA NA NA    8
33  7 NA NA NA    9

Примечание

В вопросе ввод называется df, предполагая, что это фрейм данных, но его отображение в вопросе показывает, что это, фактически, матрица.Ради воспроизводимости мы используем эту матрицу в наших вычислениях выше:

m <- matrix(c(1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 3L, 1L, 
  2L, 1L, 2L, 3L, 2L, 2L, 4L, 3L, 3L, 2L, 3L, 4L, 3L, 3L, 7L, 4L, 
  3L, 3L, 4L, 6L, 3L, 3L, 7L, 5L, 4L, 3L, 6L, 7L, 5L, 4L, 7L, 6L, 
  6L, 6L, 6L, 7L, 7L, 5L, 7L, 7L, 6L, 6L, 7L), 8)
0 голосов
/ 07 октября 2018
dt = read.table(header = TRUE, 
text ="X1 X2 X3 X4 X5 X6 X7
1    2    3    4    6    7    7
1    2    2    3    3    5    7
1    2    2    3    3    4    5
2    3    4    7    7    7    7
1    1    3    4    5    6    7

", stringsAsFactors= F)


# create a new column `x` with the columns collapsed together
dt$x <- apply( dt[ , names(dt) ] , 1 , paste , collapse = " ")

library(quanteda)
d = dfm_tfidf(dfm(dt$x,ngrams = 2:7, skip = 0:7), scheme_tf = "boolean", scheme_df="unary")
topfeatures(d, 25)
...