R 从许多整数中识别公共模式的频率

R 从许多整数中识别公共模式的频率,r,pattern-matching,frequency,frequency-analysis,frequency-distribution,R,Pattern Matching,Frequency,Frequency Analysis,Frequency Distribution,我有很多行的整数,每行有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 [

我有很多行的整数,每行有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
...
...
请提供建议,谢谢。

dt=read.table(header=TRUE,
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)
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) #创建一个新列'x',并将这些列折叠在一起
dt$x对于我们调用的每个序列长度
freqs
,对于
m的每一行
调用
rollappy
,以获得连续的子序列
ag
包含每个子序列及其频率,最后我们省略最小频率不为
minFreq
的子序列以保持较小的大小

在最后一行代码中,我们依次调用
freqs
,其值为
k
(子序列长度),用于4、3、2和1,以获得这些长度的子序列。把4:1改成你想要的。同样,如果您想要所有频率,而不仅仅是那些至少为2的频率,则在该行中省略
minFreq=2
。(我们至少使用了2个,以保持输出大小合理。)

注 在问题中,输入被称为
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)

m我删除了程序包建议。我的意思是,模式就像数字1、2、3一起出现的频率一样,它们在上面的行中一起出现了4次。如果你有一行
2
,有多少个
2
的实例可以算作?你的例子显示了长度为4的序列,你的评论建议长度为3的序列…到目前为止,我没有这些数据,但在这种情况下,我会将长度为4的序列计算为1,因为长度为4的序列模式较少,更容易找到频率?如果是这样,我更喜欢4的长度。
   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
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)