NoseF17 / APPR-2019-20

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

Razvrščanje v skupine #5

Open NoseF17 opened 4 years ago

NoseF17 commented 4 years ago

Začel sem pisati funkcijo:

razvrscanje <- function(){ evropa1 <- World %>% filter (continent == 'Europe') names(evropa1)[3] <- 'Drzava' delure <- A1 %>% filter(Leto == 2018, Spol == "Total") %>% select(Drzava, SteviloDelovnihUr) bdp <- A4 %>% filter(Leto == 2018) %>% select(Drzava, BDP) glavni1 <- inner_join(evropa1, delure, by = 'Drzava') glavni2 <- inner_join(glavni1, bdp, by = 'Drzava')

...

}

ki pa mi vrne problem(pri glavni1): Warning message: Column Drzava joining factor and character vector, coercing into character vector. Kako to popravim?

jaanos commented 4 years ago

To ni napaka - gre samo za opozorilo, da imaš pri združevanju v eni razpredelnici stolpec Drzava kot vektor nizov, v drugi pa kot faktor. V večini primerov to ni problem - če pa bi bilo zaradi tega združevanje prepočasno, bi se morda izplačalo vektor nizov pretvoriti v faktor (npr. s funkcijo parse_factor iz knjižnice readr).

Mimogrede: če v issue pišeš kodo v več vrsticah, to naredi tako:

```R
koda v
več vrsticah
```

Znak R pomeni, naj se pobarva kot R-jeva koda (po potrebi bi lahko tam napisal tudi ime katerega drugega programskega jezika).

NoseF17 commented 4 years ago

Hvala, bom upošteval za v naprej. S pomočjo vaj sem prišel do tega:

razvrscanje <- function(){
  evropa1 <- World %>% filter (continent == 'Europe')
  names(evropa1)[3] <- 'Drzava'
  delure <- A1 %>% filter(Leto == 2018, Spol == "Total") %>% 
    select(Drzava, SteviloDelovnihUr)
  bdp <- A4 %>% filter(Leto == 2018) %>% 
    select(Drzava, BDP)
  glavni1 <- inner_join(evropa1, delure, by = 'Drzava')
  glavni2 <- inner_join(glavni1, bdp, by = 'Drzava')
  podatki_cluster <- glavni2 %>% select('Drzava', 'SteviloDelovnihUr','BDP', 'pop_est','well_being')
  podatki.norm <- podatki_cluster %>% select(-Drzava) %>% scale()
  rownames(podatki.norm) <- podatki_cluster$Drzava
  k <- kmeans(podatk.norm, 5, nstart=1000)
  skupine <- data.frame(Drzava=podatki_cluster$Drzava, skupina=factor(k$cluster))
  slika <- tm_shape(merge(podatki_cluster, skupine, by="Drzava")) + tm_polygons("skupina")
  return(slika)
}

Funkcija vrne Error. Kje sem se zmotil?

jaanos commented 4 years ago

Najprej poskrbi, da imaš na voljo zemljevid World - nekam v vizualizacija.r dodaj vrstico

data(World)

Naslednja napaka se pojavi zaradi tega, ker je razpredelnica glavni2 označena kot zemljevid, zaradi česar stolpec geometry preživi funkcijo select. Da se temu izogneš, bo potrebno razpredelnico pred tem označiti kot običajen data frame:

class(glavni2) <- "data.frame"

Potem bo potrebno pri merge namesto podatki_cluster uporabiti zemljevid evropa1, poleg tega pa bo potrebno dodati parameter all.x=TRUE (nisem prepričan, zakaj to ni privzeta izbira). Potrebno bo tudi poenotiti nekatera imena držav, da se prikažejo vsi podatki.

Tako bo zemljevid vseboval Evropo skupaj s celotno Rusijo in Francosko Gvajano. Da izrišeš samo Evropo, lahko funkciji tm_shape dodaš še parametra xlim=c(-1600000, 3000000) in ylim=c(4000000, 8000000) (tukaj se uporabljajo enote zemljevida, ki niso neposredno izpeljane iz zemljepisnih koordinat).

jaanos commented 4 years ago

Hvala @timotejvesel, vidim, da imaš boljšo rešitev glede mej zemljevida.

timotejvesel commented 4 years ago

Sem izbrisal komentar, saj me je @jaanos za nekaj minut prehitel (sem prepozno opazil) in je bila njegova rešitev boljša (popolnoma delujoča). Zato bom samo še enkrat napisal za meje zemljevida:

library(tmaptools)
slika <- tm_shape(podatki %>% set_projection("latlong"),
                                         xlim=c(-25, 35), ylim=c(32, 72)) + tm_polygons("skupina")
NoseF17 commented 4 years ago

Hvala obema. Kaj tocno napravi all.x=TRUE v merge-u?

timotejvesel commented 4 years ago

Vključi vse vrstice iz tabele x ter samo tiste iz tabele y, ki se ujemajo ("imajo par" v x). Če vrstica iz x nima "ujemanja" v y, bo imela v stolpcih tabele y vrednosti NA. Analogno za all.y = TRUE. \ Še razlaga iz dokumentacije: all.x - logical; if TRUE, then extra rows will be added to the output, one for each row in x that has no matching row in y. These rows will have NAs in those columns that are usually filled with values from y. The default is FALSE, so that only rows with data from both x and y are included in the output.

NoseF17 commented 4 years ago

Torej enako kot left_join? Zakaj potem včasih uporabljamo join včasih pa merge?

jaanos commented 4 years ago

Tako je. Problem je v tem, da left_join (in druge funkcije iz dplyr) ne delujejo na zemljevidih, uvoženih iz datotek SHP. Zemljevid World je drugačnega tipa - mislim, da bi dejansko z njim lahko uporabil left_join.

timotejvesel commented 4 years ago

Če se spominjam pravilno, tudi na zemljevidu World funkcija left_join ni delovala pravilno. Problem je bil pri laravidmar/APPR-2019-20#2.