잡동사니

반응형

질문

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)가 다음 행의 접두사 문자와 동일합니다.

그러나 내 데이터 프레임에서는 여기에서 언급 한 장난감 예제와 같이 행이 연속적이라는 보장이 없습니다.

그러면 출력은 다음과 같습니다.최대 연속 경로는 다음과 같습니다.16자인 TGCAGCACCACTACTA입니다.

원래 데이터 프레임의 처음 몇 행 :

    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

같은 줄에 맞지 않기 때문에 접미사 열을 별도로 작성했습니다.


답변1

요구 사항이 몇 번 명확 해지면서 그래프 이론에 기반한 새로운 솔루션을 게시 할 것입니다 (실제로 아이디어는 @Martin Wettstein에 속합니다. 질문에 대한 의견 참조). 물론 순환 그래프의 경우 문제가있을 수 있지만 여전히 또 다른 질문이 될 것입니다.

script는 인접 행렬에서 그래프를 만들고 그래프를 통해 가장 긴 경로 (직경)를 계산합니다.

제공된 실제 데이터 하위 집합에는 연속 시퀀스가 포함되어 있지 않으므로 이전 버전의 답변에서 더미 데이터를 사용합니다.

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"


답변2

내가 이해했는지 확실하지 않지만 세 열을 모두 하나로 결합하려면 다음을 사용할 수 있습니다.

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

각각 사이에 공백이 필요한 경우 :

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


 

 

 

 

출처 : https://stackoverflow.com/questions/63048669/combine-two-columns-of-a-dataframe-and-then-compare

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band