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

Urejanje tabele #1

Closed evaozebek closed 6 years ago

evaozebek commented 6 years ago

Imam težavo pri urejanju tabel z več dimenzijami, to sta tabeli 2 (poroke.starost) in 4 (razveze.starost). Kljub temu, da sem prebrala issue na podobno temo, ki ga je odprla anamkravanja, še vednp ne razumem, kako se taka tabela spremeni v obliko tidy data. Ni mi jasno kako moram poimenovati stolpce, da jih lahko potem razbijem. Hvala!

jaanos commented 6 years ago

Pri razpredelnici poroke.starost bi šel uvoz tako:

poroke.starost <- read_csv2(file ="podatki/Tabela2.csv", skip = 3, n_max = 13, locale = sl, 
                            trim_ws = TRUE, na = c("-", ""))
stolpci <- data.frame(leto = colnames(poroke.starost) %>% { gsub("X.*", NA, .) } %>% parse_number(),
                      nevesta = unlist(poroke.starost[1, ])) %>% fill(leto) %>%
  apply(1, paste, collapse = ",")
stolpci[1] <- "zenin"
colnames(poroke.starost) <- stolpci
poroke.starost.tidy <- melt(poroke.starost[-1, ], variable.name = "stolpec",
                            value.name = "stevilo", id.vars = "zenin") %>%
  filter(! grepl("SKUPAJ", zenin), ! grepl("SKUPAJ", stolpec)) %>%
  mutate(stolpec = parse_character(stolpec)) %>%
  transmute(leto = stolpec %>% strapplyc("^([0-9]+)") %>% unlist() %>% parse_number(),
            zenin = zenin %>% strapplyc("^(.* let)") %>% unlist(),
            nevesta = stolpec %>% strapplyc(",(.* let)") %>% { gsub("65", "65 +", .) } %>% unlist(),
            stevilo = stevilo %>% parse_number()) %>%
  mutate(zenin = zenin %>% parse_factor(unique(zenin), ordered = TRUE),
         nevesta = nevesta %>% parse_factor(unique(nevesta), ordered = TRUE))

Za razliko od anamkravanja#1 imaš v starostih številke, tako da raje med letnico in starost postaviš vejico, s katero se potem orientiraš pri razbijanju dobljenih imen stolpcev. Za uporabo funkcije fill potrebuješ knjižnico tidyr - najbolje, da jo uvoziš kar v lib/libraries.r in ta program vsakič poženeš pred začetkom dela, da se naložijo potrebne knjižnice.

Ker lahko sumarne podatke (tj., kjer starost vsebuje niz SKUPAJ) izračunaš iz ostalih podatkov, jih je potrebno iz razpredelnice v obliki tidy data izločiti. Da bodo starostne kategorije pravilno urejene (in se bodo ustrezno prikazale na grafih), bo treba poskrbeti za ustrezno ureditev (sicer bi se uredile po abecedi in bi kategorija Pod 20 let prišla na konec). Funkcija unique vrača vektor različnih vrednosti v vrstnem redu prve pojavitve, tako da sta dobljena faktorja ustrezno urejena (zadnja kategorija pri ženinih je 65 + let, pri nevestah je bila 65 let ali več - ker se ohrani samo niz do besede let, z ustrezno zamenjavo pride do poenotenja imen kategorij, tako da sta oba stolpca primerljiva).

Pri razpredelnici razveze.starost bo enostavneje, saj imaš v stolpcih samo eno dimenzijo. Vseeno pa bo treba poskrbeti za izločanje sumarnih podatkov in ustrezne kategorije:

razveze.starost <- read_csv2(file ="podatki/Tabela4.csv", skip = 3, n_max = 253, locale = sl) %>%
  fill(1) %>% drop_na(2) %>% melt(id.vars = 1:2, variable.name = "zena", value.name = "stevilo")
colnames(razveze.starost)[1:2] <- c("leto", "moz")
razveze.starost.tidy <- razveze.starost %>%
  filter(! grepl("SKUPAJ", moz), ! grepl("SKUPAJ", zena)) %>%
  mutate(moz = moz %>% strapplyc("^(.* let)") %>% unlist(),
         zena = zena %>% parse_character() %>% strapplyc("^(.* let)") %>% unlist() %>%
           { gsub("pod", "Pod", .) }) %>%
  mutate(moz = moz %>% parse_factor(unique(moz), ordered = TRUE),
         zena = zena %>% parse_factor(unique(zena), ordered = TRUE))