NikiFMF10 / APPR-2020-21

Vzorčni repozitorij za projekt pri predmetu Analiza podatkov s programom R v študijskem letu 2020/21
MIT License
0 stars 0 forks source link

Uvoz #1

Open jaanos opened 3 years ago

jaanos commented 3 years ago

Opažam, da imaš v osnovi le dva tipa razpredelnic (rivalstvo in turnirji), tako da bi jih bilo dobro združiti - tako namreč pri analizah ne boš omejen na enega samega igralca ali par hkrati. Tudi sam uvoz lahko bistveno skrčiš:

igralci <- c("Djokovic"="Novak Djokovic",
             "Nadal"="Rafael Nadal",
             "Murray"="Andy Murray",
             "Federer"="Roger Federer")

# za urejeni faktor - preveri pravilnost vrstnega reda!
runde <- c("R128", "R64", "R32", "R16", "RR", "QF", "SF", "BR", "F", "S", "W", "G")

turnirji <- lapply(names(igralci), function(igralec)
  sprintf('podatki/%s-turnirji.csv', igralec) %>%
    read_csv(locale=locale(encoding='Windows-1250')) %>%
    mutate(Igralec=igralci[igralec])) %>% bind_rows() %>%
  separate(wonLost, c("Zmage", "Porazi"), sep="-") %>%
  transmute(Igralec=factor(Igralec), Turnir=factor(name),
            Udelezba=eventCount, Sezone=seasons,
            NajboljsiRezultat=parse_factor(bestResult, levels=runde, ordered=TRUE),
            ZadnjiRezultat=parse_factor(lastResult, levels=runde, ordered=TRUE),
            Zmage=parse_number(Zmage), Porazi=parse_number(Porazi), Pokali=titles,
            DelezZmag=parse_number(wonPct))

rivalstvo <- lapply(1:3, function(i)
  lapply((i+1):4, function(j)
    sprintf('podatki/%s-%s-rivalstvo.csv', names(igralci[i]), names(igralci[j])) %>%
      read_csv(locale=locale(encoding='Windows-1250')) %>% group_by(date, round) %>% # začasno združimo,
      mutate(Porazenec=setdiff(igralci[c(i, j)], winner_name)) %>% ungroup()) %>% # da lahko dobimo poraženca
    bind_rows()) %>% bind_rows() %>%
  separate(h2hWL, c("ZmageZmagovalca", "ZmagePorazenca"), sep="-") %>%
  transmute(Datum=date, Turnir=factor(tournament), Podlaga=factor(surface),
            Runda=parse_factor(round, levels=runde, ordered=TRUE),
            Zmagovalec=factor(winner_name), Porazenec=factor(Porazenec),
            Rezultat=score, ZmageZmagovalca=parse_number(ZmageZmagovalca),
            ZmagePorazenca=parse_number(ZmagePorazenca))

Stolpce sem nekoliko preimenoval, da ne vsebujejo šumnikov, presledkov in ostalih posebnih znakov, kot npr. % - teh se gre namreč pri poimenovanju stolpcev in spremenljivk izogibati. Prav tako je poskrbljeno za faktorje v stolpcih z manjšim številom znakovnih vrednosti (pri rundah gre za urejen faktor) ter za ločevanje podatkov o zmagah in porazih v ustrezne številske stolpce in pretvorbo deležev v števila (pravzaprav gre tukaj za izpeljan podatek, tako da bi lahko ta stolpec izpustil).

Določene podatke bi se dalo dodatno izluščiti - v stolpcu Sezone razpredelnice turnirji imaš tako v besedilu našteta leta. To bi lahko spravil v svojo razpredelnico z eno vrstico za vsako udeležbo, npr.

udelezbe <- strapply(turnirji$Sezone, "([0-9]{4})(?:-([0-9]{4}))?",
                     function(a, b, ...) as.integer(a):as.integer(ifelse(b == "", a, b)))
udelezba <- turnirji[lapply(1:nrow(turnirji),
                            . %>% rep(length(udelezbe[[.]]))) %>% unlist(),
                     c("Igralec", "Turnir")] %>% data.frame(Sezona=unlist(udelezbe))

Potem bi lahko iz razpredelnice turnirji izpustil stolpec Sezona, pa tudi stolpec Udelezba, saj gre za izpeljan podatek. Če bi hotel analizirati še rezultate dvobojev, bi jih lahko na podoben način ločil v svojo razpredelnico.

NikiFMF10 commented 3 years ago

Hvala Vam za popravek, vendar se mi pojavi še ena težava in sicer pri udelezbe mi napiše error za strapply, saj mi ne more najti omenjene funkcije.

jaanos commented 3 years ago

Funkcija strapply je iz knjižnice gsubfn, ki jo uvoziš v libraries.r - najbolje bo, da pred začetkom dela vsakič zaženeš ta program (kjer tudi uvoziš vse knjižnice, namesto da to počneš vsakič posebej), da bodo naložene vse potrebne knjižnice.