Определить частоту общего шаблона из числа целых чисел
У меня есть много строк целых чисел с 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 ответа
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)
Для каждой длины последовательности мы называем 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)