Przekształcenie kodu R na kod w Pythonie

Przekształcenie kodu R na kod w Pythonie
A1
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:19
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:

Kopiuj
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:

Kopiuj
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
edytowany 1x, ostatnio: adrian18
Miang
pythona nie znam, ale R jest na tyle specyficzny, ze warto to najpierw przepisać na algorytm a nie bezpośrednio z R na pythona
lion137
Opisz dokładnie co ten kod robi, to się go przepisze:)
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4939
0

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


JA
  • Rejestracja:około 6 lat
  • Ostatnio:około 19 godzin
  • Postów:52
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?

A1
Indel jest określony jako jeden lub więcej następujących po sobie znaków '-'. Tak np. 4 znaki '-' obok siebie oznaczają 1 indel.
A1
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 4 lata
  • Postów:19
0

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

Kopiuj
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:

Kopiuj
(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?

JA
  • Rejestracja:około 6 lat
  • Ostatnio:około 19 godzin
  • Postów:52
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?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:3 minuty
  • Postów:4939
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?:

Kopiuj
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ół".


A1
Dla takich danych wynik powinien być następujący: 0 1 0, 0 0 0, 1 1 0, 0 1 0, 1 0 1.
lion137
Wytłumacz każdy wynik, w poście, nie w komentarzu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.