【问题标题】:R - how to find longest duplicate sequences and their frequenciesR - 如何找到最长的重复序列及其频率
【发布时间】:2018-02-23 18:45:05
【问题描述】:

我有一些看起来像这样的数据:

29  32  33  46  47  48
29  34  35  39  40  43
29  35  36  38  41  43
30  31  32  34  36  49
30  32  35  40  43  44
39  40  43  46  47  50
 7  8    9  39  40  43
 1  7    8  12  40  43

实际上还有很多数据,但我想保持简短。我想在 R 中找到一种方法来找到所有行的最长公共子序列并按频率(递减)排序,其中仅报告序列中具有多个元素和多个频率的那些公共子序列。有没有办法在 R 中做到这一点?

所以示例结果类似于:

[29] 3
[30] 2 
...
( etc for all the single duplicates across each row and their frequencies )
...
[46  47] 2
[39  40  43] 3
[40, 43] 2

【问题讨论】:

  • “所有行的最长公共子序列”到底是什么意思?
  • @Nena 你问的不是很清楚。你能看到我的答案的输出与你想要的一致吗?
  • 所有行中最长的公共子序列意味着:如示例中所示,每行之间的所有公共数字以及所有行重复组合的次数。假设行按升序排序。那有意义吗? EX:[39,40,43] 重复 3 次。尽管重复 [39, 40] 也可能是真的,但是由于最长的组合是 [39, 40, 43],因此采用该组合,因为它是最长的。希望这是有道理的

标签: r dataframe subsequence


【解决方案1】:

您似乎在问两种不同的问题。您希望 1) 单个值按列的连续运行长度和 2) ngram 计数(非连续)(按行)但按列计数。


library(tidyverse)
# single number contiguous runs by column
single <- Reduce("rbind", apply(df, 2, function(x) tibble(val=rle(x)$values, occurrence=rle(x)$lengths) %>% filter(occurrence>1)))

单张输出

    val occurrence
  <int>      <int>
1    29          3
2    30          2
3    40          2
4    43          2
5    43          2

# ngram numbers by row (count, non-contiguous)
restof <- Reduce("rbind", lapply(1:(ncol(df)-1), function(z) {
    nruns <- t(apply(df, 1, function(x) sapply(head(seq_along(x),-z), function(y) paste(x[y:(y+z)], collapse=" "))) )
    Reduce("rbind", apply(nruns, 2, function(x) tibble(val=names(table(x)), occurrence=c(table(x))) %>% filter(occurrence>1)))
}))

ngram 的输出

       val occurrence
     <chr>      <int>
1    39 40          2
2    46 47          2
3    40 43          3
4 39 40 43          2

合并数据

ans <- rbind(single, restof)

输出

       val occurrence
     <chr>      <int>
1       29          3
2       30          2
3       40          2
4       43          2
5       43          2
6    39 40          2
7    46 47          2
8    40 43          3
9 39 40 43          2

您的数据

df <- read.table(text="29  32  33  46  47  48
29  34  35  39  40  43
29  35  36  38  41  43
30  31  32  34  36  49
30  32  35  40  43  44
39  40  43  46  47  50
 7  8    9  39  40  43
 1  7    8  12  40  43")

【讨论】:

  • 我在源代码中看到39 40 43 3 次。预计输出中有 2 吗? (我知道 OP 在预期输出中显示 2 但想到了一个错误)
  • 40 43 是数据中没有39 的 2 倍,OP 的预期输出也给出 2,你返回 3
  • 是的,情况很奇怪。即使对于 ngram,您仍然需要按列计数。那是对于三元组39 40 43,一列中有多少个(按第一个元素索引?)...无论如何,即使 OP 的描述不是很清楚,它也与 OP 的输出一致。
  • 看我的第二条评论,这并不完全一致。当我读到它时,没有什么可做的,但不像你说的那么清楚
  • 是的,我明白你的意思。需要进一步澄清。感谢您指出差异。
猜你喜欢
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2020-04-12
相关资源
最近更新 更多