MancaStrgar / APPR-2017-18

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2017/18
MIT License
0 stars 0 forks source link

Angleška imena držav #2

Open MancaStrgar opened 6 years ago

MancaStrgar commented 6 years ago

Pzdravljeni, od sošolke sem koperala kodo, ki ste ji jo dali, da dobi tabelo držav iz zastav: html_tabela4 <- stran %>% html_nodes(xpath="//table[@class='wikitable']") %>% .[[3]] tabela4 <- html_tabela4 %>% html_table(fill = TRUE) drzave <- html_tabela4 %>% html_nodes(xpath=".//tr") %>% .[-1] %>% sapply(. %>% html_nodes(xpath="./td") %>% lapply(. %>% html_nodes(xpath="./a[@class='image']") %>% htmlattr("href") %>% sapply(. %>% { gsub("US._Flag", "Flag_of_the_United_States", .) } %>% strapplyc("Flagof(.)\.svg") %>% { gsub("", " ", gsub("\(.*", "", gsub("^the_", "", .))) }) %>% .[1]) %>% { ifelse(sapply(., is.list),NA, .) } %>% unlist()) %>% t() %>% data.frame()

Ona je imela angleško stran wikipedije, jaz pa imam slovensko in mi sedaj vrne države v angleščini, ali se da to kako spremeniti, da bi mi jih napisalo v slovenščini, tako kot so na uradni strani. Hvala

jaanos commented 6 years ago

Zaenkrat svetujem, da imena držav pustiš v angleščini, saj bodo najbrž taka na zemljevidu in bo tako mogoče združevanje. Če želiš prevesti podatke za potrebe prikazovanja, si poglej pristop s slovarjem pri jonagricar#2.

Še to: ko daješ kodo v issue, naredi tako:

    ```R
    koda

(brez začetnega zamika). Tako se bo koda lepo prikazala in pobarvala ter se nekateri znaki ne bodo razumeli kot oblikovanje Markdown. Preden objaviš komentar, lahko klikneš na *Preview*, da vidiš, kako bo izgledal.
MancaStrgar commented 6 years ago

pogledala sem si kodo od Jone in mi pri tabela4 dela pravilno, pri tabela5 pa pomeša države, ko jih prevedem v slovenščino, kaj delam narobe?

jaanos commented 6 years ago

V tabela5 ne vidim držav - ali imaš zadnjo različico na GitHubu? Sicer pa bi se to znalo zgoditi, če je stolpec faktor namesto znakovnega niza. Najlažje to preveriš, če v konzolo napišeš

summary(tabela5)

Izpisal se bo povzetek vsakega stolpca - za številske stolpce se bo izpisala kratka statistika (kvartili in mediana), pri faktorjih se bodo izpisale najpogostejše vrednosti, pri znakovnih stolpcih pa se bosta izpisala samo dolžina in tip. Če imaš faktor, lahko uporabiš funkcijo parse_character iz knjižnice readr za pretvorbo v znakovni niz. Potem bi moralo delovati indeksiranje slovarja.

Sicer pa vidim, da imaš definirane funkcije za uvoz, ki jih nikjer ne kličeš - kličeš samo funkcijo iz vzorca, ki je več nimaš. Da pokličeš funkcijo, narediš npr.

ep.rezultati <- uvozi.ep.rezultati()

da se ti podatki uvozijo v razpredelnico ep.rezultati. Podobno seveda naredi še za druge razpredelnice, klice funkcij uvozi.obcine in uvozi.druzine pa odstrani (funkcijo uvozi.druzine lahko zaenkrat pustiš, če ti je v pomoč - se ti pa zdaj pojavi dvakrat). V svojih funkcijah imaš še kodo iz vzorca - če nadaljnje obdelave ne potrebuješ, to kodo odstrani, sicer pa prilagodi za ustrezne podatke po potrebi. Na koncu vsake funkcije seveda poskrbi, da se uvožena razpredelnica vrne (z return vrni ustrezno razpredelnico). Ko poženeš uvoz.r, se mora torej brez napak izvesti celoten uvoz.

Pri prvih razpredelnici poskrbi, da bo v obliki tidy data - namesto stolpcev za vsako uvrstitev naj bo torej en stolpec, ki pove uvrstitev, in en stolpec za državo - to lahko narediš s funkcijo melt iz knjižnice reshape2. Celoten uvoz bi potem izgledal tako:

uvozi.ep.rezultati <- function() {
  link <- "https://sl.wikipedia.org/wiki/Evropsko_prvenstvo_v_košarki"
  stran <- html_session(link) %>% read_html()
  tabela1 <- stran %>% html_nodes(xpath="//table[@class='wikitable']") %>%
    .[[1]] %>% html_table(dec = ",", fill = TRUE)
  tabela1 <- tabela1[-1,-c(2, 4, 7)]
  colnames(tabela1) <- c("LETO", 1:4)
  tabela1 <- melt(tabela1, id.vars = "LETO", variable.name = "Uvrstitev", value.name = "Drzava") %>%
    mutate(LETO = LETO %>% strapplyc("([0-9]+)") %>% unlist() %>% parse_integer(),
           Uvrstitev = Uvrstitev %>% parse_number())
  Encoding(tabela1$Drzava) <- "UTF-8"
  return(tabela1)
}

Druge razpredelnice sploh ne potrebuješ, saj lahko vse podatke izpelješ iz prve.

Pri tretji razpredelnici bo potrebno višine in datume pretvoriti v števila oziroma datumske vrednosti. To lahko storiš tako (kar znotraj funkcije):

  tabela3 <- tabela3 %>% mutate(VIŠINA = parse_number(VIŠINA),
                                ROJEN = gsub("[^0-9.]", "", ROJEN) %>% parse_date("%d.%m.%Y"))

Tukaj je bilo potrebno pri datumih pobrisati vse znake razen števk in pike, saj so bili v rojstnem datumu za Dragića presledki (en navaden in en nedeljiv). Funkcija parse_date iz knjižnice readr potem datum v podani obliki pretvori v obliko, s katero lahko R dela (take datume se da potem tudi risati na grafih). Svetujem sicer, da v imenih stolpcev ne uporabljaš šumnikov in presledkov (pa tudi ne drugih posebnih znakov), saj zna to povzročati probleme.

MancaStrgar commented 6 years ago

Zgleda mi ni naložilo zadnje verzije na github, sedaj sem to ponovno naredila. Ko sem dodala vašo kodo za tabela1, mi ne dela pravilno, saj mi pri uvrstitvi vrne le drugo in četrto mesto.

Glede tabele2 mi potem svetujete, da jo kar odstranim?

MancaStrgar commented 6 years ago

Pri tabela3 mi sedaj datume napiše z vezaji(leto-mesec-dan) , ali je to vredu, saj vidim v kodi, da je mišljeno, da napiše datume s pikami

MancaStrgar commented 6 years ago

sedaj vidim kako deluje koda za tabela1, ki ste mi jo napisali. Pa je res bolje imeti tabelo zapisano na tak način, meni se zdi manj pregledno. Kako bi lahko vsaj uredila vrstice, da je skupaj po letih, ne pa po uvrstitvah

jaanos commented 6 years ago

Ideja oblike tidy data je ta, da je s takimi podatki lažje delati, saj vse filtriranje lahko opravljaš po vrsticah, stolpci pa so fiksni - če bi želela dodati še več podatkov (npr. uvrstitve pod četrtim mestom), bi enostavno dodala nove vrstice. Za človeka je sicer morda res manj pregledno, a se podatke vedno da spraviti v drugačno obliko, če jih potrebuješ za prikaz.

Tudi vrstni red podatkov v resnici ni pomemben, a ga lahko vseeno kontroliraš s funkcijo arrange. Če torej v uvozi.ep.rezultati na koncu zadnje definicije razpredelnice tabela1 dodaš še %>% arrange(LETO, Uvrstitev), se bo ob uvozu najprej uredila po letu, nato pa še po uvrstitvi. Kot rečeno, vsebuje ta razpredelnica vse informacije, ki jih imaš v tabela2, tako da lahko slednjo odstraniš.

V tretji razpredelnici so datumi zapisani v obliki, ki jo R razume in zna z njo delati (primerjati in računati z datumi). V kodi je zapisano, naj datume prebere v obliki, ki smo je vajeni (s pikami) in pretvori v svojo obliko. Za potrebe prikaza lahko datume vedno pretvoriš v želeno obliko (v ta namen se uporablja funkcija strftime).

Še to: od vrstice 172 naprej imaš odvečno oz. podvojeno kodo z napakami (izgleda, kot da manjka začetek funkcije), zato se uvoz.r ob zaganjanju ne izvede. To kodo kar odstrani (ali vsaj poskrbi, da bo mogoče pognati celoten uvoz.r).

MancaStrgar commented 6 years ago

Najlepša hvala, se mi zdi, da imam sedaj vse urejeno tako kot je treba. Zanima me samo še glede encoding-a, pri tabeli ena imam napisano kodo :

Encoding(tabela1$DRZAVA) <- "UTF-8"

To sem dopisala še pri tabeli 3 in 4, pa mi ne izpiše lepo države, zato sem raje izbrisala. Ali tam to tudi potrebujem ali ni potrebe po tem?

jaanos commented 6 years ago

Nastavitev lastnosti Encoding je potrebna, če se po branju s spletne strani šumniki (ali drugi naglašeni znaki) ne prikažejo pravilno (je pa to tudi odvisno od sistema - meni na Linuxu običajno že deluje, tako da nastavitev ni potrebna, na Windowsih pa je navadno potrebno). Če ti torej pri slo.reprezentanca ne prikaže pravilno šumnikov pri imenu ali klubu, oziroma pri MVP pri imenu (kjer se pojavljajo še drugi naglašeni znaki), naredi to nastavitev za ustrezne stolpce.

Kot sem sicer že rekel, prevajanja držav ne vključi v samo funkcijo za uvoz, saj s tem izgubiš angleška imena. Slovar prav tako definiraj izven funkcije - uporabila ga boš lahko npr. pri risanju grafov.