【问题标题】:Combine two columns of a dataframe and then compare合并数据框的两列,然后进行比较
【发布时间】:2020-07-23 07:03:55
【问题描述】:

我有一个 3 列和 859 行的数据框。数据框就像

df1:

MacroNode                                     Prefix                               Suffix
AAACCGCCAATATCTCGACGAGAAAAGCGAC      GCCAACTGGATAACCACGCCCTG                GCCAACTGGATAACCACGCCC
ATTTCTGCGAGGTGCAGGGCAATTACATCAT       TAGGCCTT                               AAAACCCTTGGAA    

这些基本上是图的节点和前缀和后缀边:

macronode + suffix = prefix of next macronode + that next macronode

我必须看看这个数据框中存在的行可以达到的最大拉伸量是多少。因此,我认为首先我必须合并行然后进行比较。但我无法理解如何做到这一点。欢迎任何想法。

预期结果

我在这里给出一个简短的数据框

玩具 df:

MacroNode        Prefix          Suffix
 GC                T               A
 CA                G               C
 AC                C               T
 CT                A               A

正如您在此处看到的,如果您将宏节点的字符与第一行的后缀字符 (GC + A) 相等,则它等于下一行的前缀字符 + 下一行的宏节点的字符 (G + CA)。

但在我的数据框中,不能保证行像我提到的玩具示例中那样是连续的。

然后输出应该看起来像 最大连续路径为: TGCAGCACCACTACTA,16 个字符。

原始数据框的前几行:

    MacroNode                         Prefix                               
 1. AAACCGCCAATATCTCGACGAGAAAAGCGAC   GCCAACTGGATAACCACGCCCTGAGACTCAAGGGCGT
 2. AAACTTCTGCCGGAATATAAAGCCGCGCCGG   AGCAAAGCGCGCCACTTCACCCTGAGCTT
 3. AAAGCATTGTGGCCGGAACCGATGACGCGCC   CGGCGTCCCCTGGATGATGGCTTT
 4. AACACCACGCTGGAGATGGTTGCTGAACGTG   AAATTATTAGAATTACAAGGGATTGCC
 5. AACCAGAGCGTTCTGTTACGTGATGTGAACG   AAGTTGCGCCGGGTAGGCGTTACTTTGCTG
 6. AACGAAGTTCAGCCGCGTGCGAACGGTCAGG   GGTATACGCTTCTGCTTCACGAATGTATTGCTGTT
 7. AACTCGGGGCTCGGTCAGCACACCACGACCG   AAAGAGATCCTGACCAACGATATCTCTGAC
 8. AAGCGGTTGAGGAAGGGAAAATCGCGGAAAC   ACCGATCCGGGCTGCGCTATCCGGG
 9. AAGGCGCTCGTTGATGAACTGGAGCTGGCGC   AATTTCGCGTTGCAGTCTGACTCTGCACGTCTT
10. AATATCGACCAGCAATTCGCCTAAAAAGAAG   CCGCTGCCCGTGGATCAACCAGT
11. AATCCACACGTTCAGCAACCATCTCCAGCGT   ATCCACTGGACGAGCTACGCCGCTT
12. AATCGCGATATTTACACAGACCTAAATAGTC 
                                   
                               GCAAACACGATACCGATCCGGGCTGCGCTATCCGGGAAGCGGT


13. AATTTCCGGCGCGGCTTTATATTCCGGCAGA   ACAGACGCTCGCGAGT
14. ACCACCCAGCACGATGCCAGAAATCAGTGGG   AAACAGCGGCTCTCCACTGCCAGAGCAT
15. ACCAGCGTGCCTTCCATCATGTTCATTGCTA   GCAGATCCGTGCTAACGCGGTCGTT
16. ACTGTTCCGGCGTGGCATTAGGTGTTGATCG   CAGGCATACCGACTT
17. CCCTGGCCGTTTGCTTCGGCTTCGTGCTGGG   ACTCTGGGTGTTG


Suffix
 1. TAATGCCCTGATGCACGGCACC
 2. GTCTCGATATACAGACGCTCGCGAGTAATTT
 3. ATCCCCATCGCATTCA
 4. TGGATTATCCACTGGACGAGCTACG
 5. ATAACGCACAAACGCTGGCAAACCTGA
 6. TTGTACGCACGCGCCTCTTCGAGGATACGTTGCG
 7.  C
 8. CCGTTTCGAAAACTATC
 9. AGCTGTCTGCCAATAA
10. TCAATCGCGAGGCCGGTTCGTT
11. AGGGATTGCCAACACC
12. CTCAGGGCTTTGTCGAATTCCAT
13. AGTTTAGCAAAGCGCGCCACTTCACCCTGAGCTTCCAGG
14. CCATGCGTGCTGCCAATGTA
15. GCTGGATATTCTGGTTGATGATGGTCATGTTCGCGGCCTGG
16. CAACGCTAAAGGCGATGACTTCAGCCAGTGTCTCCGCGCCCAGCGCCAACATCACCAGA
17. TAGCTTCATGCTGTAATGATCAATCGCGGGGC

我已经单独编写了后缀列,因为它不适合在同一行中。

【问题讨论】:

  • 您能补充更多细节吗?另外,您能否澄清一下suffix + macronode = prefix of next macronode + that next macronode 表达式的含义。你也可以定义maximum stretch吗?
  • @zx8754 预期的输出基本上是连续出现的这个字符的最大数量。正如我提到的,宏节点的字符+该节点的后缀字符=下一个宏节点的前缀字符+下一个宏节点的字符。例如,如果一个宏节点的字符是“ACGG”并且附加到它的后缀是“GGC”,那么这个“ACGG”+“GGC”即“ACGGGGC”等于下一个宏节点的前缀可能是“ACG”+这个下一个宏节点的字符“GGGC”..
  • @zx8754 我已经编辑了原始帖子并提供了一个玩具示例。让我知道这是否有帮助。非常感谢。
  • 只是为了确保我理解正确的问题:您正在寻找将此类表转换为图形的程序(使用前缀和后缀链接节点),然后找到最长的路径所有节点都没有访问一个节点两次?
  • @Ashi:不过,对于这个问题,如果你有图表会更容易。不是数据框。这是一个旅行推销员问题,图论中有一些优雅的方法,但如果你想从像你这样的桌子上解决,你需要大量的蛮力。

标签: python r dataframe bioinformatics string-comparison


【解决方案1】:

由于需求被澄清了几次,我将发布一个基于图论的新解决方案(实际上,这个想法属于@Martin Wettstein,请参阅cmets to question)。当然,在循环图的情况下可能会出现问题,但这将是另一个问题。

脚本从邻接矩阵创建图并计算通过图的最长路径(直径)。

由于提供的真实数据子集不包含连续序列,我将使用上一版本答案中的虚拟数据。

library(dplyr)
library(igraph)
 
dat_txt <- "MacroNode        Prefix          Suffix
 GC                T               A
 CA                C               C
 AC                C               T
 CT                A               A
 GC                T               A
 CA                G               C
 AC                C               T
 CT                A               A"

# Concat strings
dat <- read.table(text = dat_txt, header = TRUE)
res <- dat %>%
  mutate(cur = paste0(MacroNode, Suffix),
         follow = paste0(Prefix, MacroNode),
         full = paste0(Prefix, MacroNode, Suffix))

# Prepare adjacency matrix
edge_mat <- outer(seq_len(nrow(res)), seq_len(nrow(res)), function(r, c) {
  return(res[r, "cur"] == res[c, "follow"])
})

# Construct graph
res_g <- graph_from_adjacency_matrix(edge_mat)

# Get the path with maximum length
g_diam <- get_diameter(res_g)

# Concatenate longest path
long_seq <- paste(res[g_diam, "full"], collapse = "")

这是一个结果:

> long_seq
[1] "TGCAGCACCACTACTA"

【讨论】:

  • 嗨@Istrel 感谢您提供详细的代码。我已经运行了这段代码。我认为这只是将一行与其紧邻的下一行进行比较,但我需要检查所有行。有什么办法吗?
  • @Ashi,我添加了一个全表检查程序。请测试一下。
  • 感谢 rle() 函数。我使用了你的代码,最长的序列是“”(空白)。我不知道是否真的没有最长的序列存在。我还更新了问题,给出了我正在使用的所有 17 行数据框。
  • 我想我知道您提供的代码有问题。在我的数据框中看到,不能保证连续的宏节点实际上是在连续的行中。这可能是实际连续的节点相隔几行的情况。我应该进行任何排序或分箱以使它们连续出现吗?
  • @Ashi 我已经更改了脚本,现在它是图论方法的实现,由 Martin Wettstein 在 cmets 中提出。
【解决方案2】:

不确定我是否理解,但将所有三个列合并为一个,您可以使用这个:

df1$newcol ->  paste0(MacroNode, Prefix, Suffix)

如果你想在每个之间有一个空格:

df1$newcol ->  paste0(MacroNode, " ",Prefix, " ",Suffix)
                                                          

【讨论】:

  • 我怀疑这是预期的输出。
猜你喜欢
  • 2018-03-30
  • 2019-03-29
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多