合并数据框的两列,然后进行比较
Combine two columns of a dataframe and then compare
我有一个 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
我单独写了后缀栏,因为它不适合在同一行。
不确定我是否理解,但要将所有三列合并为一列,您可以使用此:
df1$newcol -> paste0(MacroNode, Prefix, Suffix)
如果你想在每个之间有一个 space:
df1$newcol -> paste0(MacroNode, " ",Prefix, " ",Suffix)
由于要求被澄清了几次,我将post一个基于图论的新解决方案(实际上,这个想法属于@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"
我有一个 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
我单独写了后缀栏,因为它不适合在同一行。
不确定我是否理解,但要将所有三列合并为一列,您可以使用此:
df1$newcol -> paste0(MacroNode, Prefix, Suffix)
如果你想在每个之间有一个 space:
df1$newcol -> paste0(MacroNode, " ",Prefix, " ",Suffix)
由于要求被澄清了几次,我将post一个基于图论的新解决方案(实际上,这个想法属于@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"