Przekształcenie kodu R na kod w Pythonie

0

Witam, posiadam kod napisany w R i chciałbym go przekształcić na kod w Pythonie. Niestety nie wiem za bardzo jak to zrobić, jestem osobą początkującą. Gdyby ktoś był w stanie pomóc mi, wytłumaczyć co zrobić po kolei i z jakich funkcji skorzystać, to byłbym wdzięczny.
Tutaj jest kod napisany w R:

foo <- function(x){
  xSplit <- strsplit(x, "")

  # indels
  indels <- unique(
    unlist(
      lapply(xSplit, function(i){ 
        ix <- which(i == "-")
        g <- c(0, cumsum(diff(ix) > 1))
        split(ix, g)
      }),  recursive = FALSE))
  # sort by position
  indels <- indels[order(sapply(indels, `[`, 1), lengths(indels))]
  names(indels) <- paste0("indel_", seq(length(indels)))

  # return binary
  t(
    sapply(xSplit, function(i){
      sapply(indels, function(j){
        !all(i[ j ] == "-")
      })
    }) * 1
  )
}
# example data
x1 <- c("CATG----ACAGAGCGACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG",
        "CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACG---GGTGGCCCCGG")
x2 <- c("CATG----ACAGAGCGACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG",
        "CATGCCCGACAGAGCGACCCGCGAACACGTTACAAACACTACG---GGTGGCCCCGG",
        "CATG----ACAGA---ACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG")

Ten kod ma za zadanie zakodowanie indeli (przerw oznaczonych '-') w sposób binarny. Porównuje on np. te 3 sekwencje, które są w x2 i gdy jest przerwa oznacza to jako 0, a jeśli przerwy nie ma w tym miejscu daje 1. Następnie układa on to w kolejności. Tutaj podaje wynik tego kodu dla x2:

foo(x2)
#      indel_1 indel_2 indel_3 indel_4
# [1,]       0       1       0       1
# [2,]       1       1       1       0
# [3,]       0       0       0       1
0

Super, zedytowałeś; teraz zacznij to pisać w Pythonie, bedziemy patrzeć.

0

a dlaczego masz w wyniku tylko indel_4 jak tam tych przerw jest więcej,
"CATG----ACAGA---ACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG"
ja tutaj widze 9 więc czemu nie ma w tabeli wynikowej indel_1 ... indel_9?

0

Wykorzystałem funkcję re.finditer w ten sposób:

seq = ["CATG----ACAGAGCGACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG",
       "CATGCCCGACAGAGCGACCCGCG---ACGTTACAAACACTACG---GGTGGCCCCGG",
       "CATG----ACAGA---ACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG"]
from re import finditer
for x, _ in enumerate(seq):
    for match in finditer('-+', str(seq[x])):
        print(match.span(), match.group())

I jako wynik otrzymałem przedziały, w których znajdują się indele:

(4, 8) ----
(23, 25) --
(23, 26) ---
(43, 46) ---
(4, 8) ----
(13, 16) ---
(23, 25) --

W jaki sposób można byłoby to teraz porównać między sekwencjami?

0

Skoro indel to grupa znaków to dlaczego dla x2 masz 4 indele jak ja tam widzę maksymalnie 3 grupy w tym przypadku:
"CATG----ACAGA---ACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG"
Możesz wytłumaczyć jak powstała ta tabelka z tego?

0

@javafxdev: Jest OK, x2to lista trzech stringów i porównujemy, pierwszy indel: 0 1 0, w pierwszym jest - 0, w drugim w tym samym miejscu nie ma kreski - 1, w trzecim nie ma, i tak dalej.
@adrian18: Jaki byłby wynik dla takich danych?:

x2 <- c("CATG----ACAGAGCGACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG",
        "CATGC-CGACAGAGCGACCCGCGAACACGTTACAAACACTACG---GGTGGCCCCGG",
        "CATG----ACAGA---ACCCGCG--CACGTTACAAACACTACGCGGGGTGGCCCCGG")

0 1 0, 0 0 0, 0 1 0, 1 1 0, 0 1 0, 1 0 1? Jeśli tak (jeśli nie to też :) ), to regex nie jest tu najlepszym pomysłem, lepiej potraktować to jako macierz i przeszukiwać po indeksie "w dół".

1 użytkowników online, w tym zalogowanych: 0, gości: 1