Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并数据帧的两列,然后进行比较_Python_R_Dataframe_Bioinformatics_String Comparison - Fatal编程技术网

Python 合并数据帧的两列,然后进行比较

Python 合并数据帧的两列,然后进行比较,python,r,dataframe,bioinformatics,string-comparison,Python,R,Dataframe,Bioinformatics,String Comparison,我有一个3列859行的数据框。数据帧就像 df1: 这些基本上是图的节点、前缀和后缀边: macronode + suffix = prefix of next macronode + that next macronode 我必须看看这个数据框中的行可以实现的最大拉伸是什么。因此,我认为首先我必须合并行,然后比较。但我不明白如何做到这一点。欢迎提出任何意见 预期结果 我在这里给出一个简短的数据框架 玩具df: MacroNode Prefix Suffix

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

df1:

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

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)

但是在我的数据帧中,不能保证这些行是连续的,就像我在这里提到的玩具示例中那样

那么输出应该是 最大连续路径为: TGCAGCata,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

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

不确定我是否理解,但要将所有三个COL合并为一个,您可以使用以下方法:

df1$newcol ->  paste0(MacroNode, Prefix, Suffix)
如果要在每个之间留出空间,请执行以下操作:

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

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

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

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

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 = "")

你能补充更多细节吗?另外,您是否可以澄清表达式
后缀+宏节点=下一个宏节点的前缀+下一个宏节点
的含义。您还可以定义
最大拉伸
?@zx8754预期输出基本上是连续出现的字符的最大数量。正如我提到的,宏节点的字符+该节点的后缀字符=下一个宏节点的前缀字符+下一个宏节点的字符。例如,如果一个宏节点的字符是“ACGG”,后缀是“GGC”,那么这个“ACGG”+“GGC”即“ACGGGGC”等于下一个宏节点的前缀,它可能是“ACG”+下一个宏节点的字符“GGGC”。@zx8754我编辑了原始帖子并提供了一个玩具示例。让我知道这是否有帮助。非常感谢。为了确保我正确理解这个问题:您正在寻找一个程序,该程序可以将这样一个表转换为图形(使用pre和后缀链接节点),然后在不访问节点两次的情况下找到所有节点的最长路径?@Ashi:对于这个问题,如果您有图形,会更容易。不是数据帧。这是一个旅行推销员问题,图论中有很多优雅的方法,但是如果你想从像你这样的表中解决这个问题,你需要很多蛮力。我怀疑这是预期的结果。嗨@Istrel谢谢你的详细代码。我已经运行了这个代码。我认为这只是比较一行和下一行,但我需要检查所有行。有什么办法吗?@Ashi,我增加了一个检查整张桌子的程序。请测试一下,谢谢你的rle()函数。我使用了你的代码,最长的序列是“”(空白)。我不知道是否真的没有最长的序列。我还更新了问题,给出了我正在使用的所有17行数据帧。我想我知道了您提供的代码有问题的地方。请看,在我的数据帧中,无法保证连续的宏节点实际上位于连续的行中。在这种情况下,实际上相邻的节点可能相隔几行。我应该做任何排序或分类,使它们成为连续的行吗?@Ashi我已经改变了脚本,现在它是图论方法的实现,由Martin Wettstein在评论中提出。
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"