anamavsenik / 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

problem glede urejanja tabele #1

Closed anamavsenik closed 6 years ago

anamavsenik commented 6 years ago

Imam vprašanje glede tabele povprecne_place_po_dejavnostih.csv, ki se nahaja v mapi podatki. Sploh ne vem kako naj jo uredim. Če leta in spol premaknem vodoravno bo tabela še veliko večja. Poleg tega ne vem kako naj leta,ki sedaj veljajo le za en stolpec (npr. leto 2008 sedaj velja za spol skupaj, izobrazba skupaj) kopiram tako, da bodo zapolnjeni z letnico vsi stolpci do naslednjega leta (do leta 2009 spol skupaj, izobrazba skupaj itd.).

jaanos commented 6 years ago

Da bodo podatki v obliki tidy data, bo treba narediti stolpce za leto, spol in izobrazbo imeti, vse meritve pa bodo šle v svoj stolpec. Velikost razpredelnice naj te ne skrbi - s takimi podatki je namreč najlažje delati, če bi pa želela podatke prikazati, pa jih lahko vedno pretvoriš v bolj pregledno obliko (seveda bi se morala omejiti na neko podmnožico podatkov, saj je razpredelnica z več kot 100 stolpci, ki predstavljajo tri dimenzije, prav tako nepregledna).

Ko imaš v stolpcih več dimenzij, lahko poimenuješ stolpce tako, da bodo njihova imena zajemala podatke o vseh dimenzijah, nato pa po pretvorbi z melt dobljeni stolpec razbiješ na več stolpcev. V tvojem primeru lahko izkoristiš to, da se v spolu in izobrazbi ne pojavljajo števila, tako da lahko leto postaviš vmes in nato ustrezno razbiješ:

sl <- locale(encoding = "Windows-1250", decimal_mark = ",", grouping_mark = ".")
povprecne_place_po_dejavnostih <- read_csv2("podatki/povprecne_place_po_dejavnostih.csv", 
                                            locale = sl, trim_ws = TRUE, skip = 3,
                                            na = c("-", ""), n_max = 24)
stolpci <- data.frame(spol = povprecne_place_po_dejavnostih[2, ] %>% unlist(),
                      leto = colnames(povprecne_place_po_dejavnostih) %>%
                        { gsub("X.*", NA, .) } %>% parse_number(),
                      izobrazba = povprecne_place_po_dejavnostih[1, ] %>% unlist()) %>%
  fill(1:3) %>% apply(1, paste, collapse = "")
stolpci[1] <- "dejavnost"
colnames(povprecne_place_po_dejavnostih) <- stolpci
povp.place.dejavnost <- melt(povprecne_place_po_dejavnostih[-c(1, 2), ], value.name = "povp.placa",
                             id.vars = "dejavnost", variable.name = "stolpec") %>%
  mutate(stolpec = parse_character(stolpec)) %>%
  transmute(leto = stolpec %>% strapplyc("([0-9]+)") %>% unlist() %>% parse_number(),
            spol = stolpec %>% strapplyc("^([^0-9]+)") %>% unlist() %>% factor(), dejavnost,
            izobrazba = stolpec %>% strapplyc("([^0-9]+)$") %>% unlist() %>% factor(), povp.placa)

Po branju podatkov (ker je ločilo podpičje, lahko uporabiš kar read_csv2 - paziti je treba še na ustrezno kodiranje znakov) iz imen stolpcev in prvih dveh vrstic sestaviš razpredelnico, ki bo vsebovala dimenzije za vsak stolpec. Ker te niso podane v vsakem stolpcu, lahko uporabiš fill, da zapolniš manjkajoče vrednosti (pri letih je bilo treba imena stolpcev, ki so se začela z X, nadomestiti z NA), nato pa nize v vsaki vrstici združiš skupaj s funkcijo paste s parametrom collapse. Dobljeni vektor potem uporabiš za imena stolpcev, pri čemer je bilo treba spremeniti ime prvega stolpca.

Ko imaš stolpce ustrezno poimenovane, lahko uporabiš funkcijo melt iz knjižnice reshape2, da se imena stolpcev spravijo v svoj stolpec - ta zaenkrat predstavlja tri dimenzije, tako da ga bo treba razbiti. Ker je po pretvorbi ta stolpec faktor, ga je najprej treba pretvoriti v nize (mutate ohrani ostale stolpce), nato pa še razbiti - s transmute našteješ vse želene stolpce (vključno z nespremenjenima dejavnost in povp.placa na želenih mestih).

Mimogrede: v svojem programu ne uporabljaj ukaza install.packages, saj ti bo potem namestitev sprožilo ob vsakem prevajanju poročila. Če želiš, lahko narediš poseben program za namestitev knjižnic, ki pa ga nikjer drugje ne pokličeš (tj., zaženeš na roko po potrebi). Prav tako ne želiš uporabljati ukaza View, saj se ti bodo razpredelnice prikazovale ob prevajanju poročila (zaenkrat sicer lahko pustiš, dokler se še ukvarjaš z uvozom podatkov).