【问题标题】:identify the frequency of the common pattern from a number of integers从多个整数中识别常见模式的频率
【发布时间】:2019-03-12 07:57:31
【问题描述】:

我有很多行整数,每行有 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
...
...

请指教,谢谢。

【问题讨论】:

  • 我删除了包推荐。我的意思是,这种模式就像数字 1、2、3 一样一起出现的频率,它们在上面的行中一起出现了 4 次。
  • 如果你有一行2 2 2 2 2 2 2,那会算作2 2 2 的多少个实例?
  • 您的示例显示长度为 4 的序列,您的评论建议长度为 3 的序列 ...
  • 到目前为止我还没有这个数据,但在这种情况下,我会算作 1
  • 是不是长度为4的序列模式更少,更容易找到频率?如果是这样,我更喜欢长度为 4 更好。

标签: r pattern-matching frequency frequency-analysis frequency-distribution


【解决方案1】:

对于每个序列长度,我们调用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)

【讨论】:

    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多