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

Težava z definiranjem funkcij #1

Closed juresternad closed 3 years ago

juresternad commented 3 years ago

V projektu imam tri podobne tabele, zato jih poskušam urejati tako, da napišem funkcijo, ki neko specifično urejanje opravi (npr. odstranitev vrstice) in nato definiram seznam tabel (list(tabela1,tabela1)) in uporabim lapply. Pri nekaterih urejanjih npr. colnames(tabela) <- c(imena) pa mi že same definicije funkcije ne uspe narediti tako, da bi vrnila prenovljeno tabelo. Kot razumem postopek opravi, ampak rezultata ne shrani. Bi se dalo to kako popraviti, ali moram ročno urejati vsako tabelo posebej? Podobno težavo imam tudi pri preimenovanju posameznih elementov v tabeli npr. tabela(1,2) <- "ime".

katarinabrilej commented 3 years ago

Vidim, da imaš kodo za uvoz podatkov v datoteki poskus.R, ki pa ni v nobeni mapi, zato jo raje premakni v ta namen ustvarjeno mapo uvoz. Prav tako lahko knjižnice, ki jih potebuješ in jih imaš napisane na začetku premakneš v datoteko libraries.r v mapi lib in potem pred začetkom dela samo poženeš to datoteko.

Prav tako ne najdem mape podatki, kjer naj bi bile csv datoteke, ki jih potem kličeš v datoteki poskus.R. Tako, da ne morem zares videti za kakšne tabele gre in kako bi jih bilo najbolje urediti.

juresternad commented 3 years ago

Kodo za uvoz imam zaenkrat raje še v datoteki poskus.R, da lahko sproti, ko urejam podatke pogledam še kako so uvoženi podatki v originalni datoteki. Ko bo moja koda končana jo bom pa seveda premaknil v datoteko uvoz.R. Knjižnice pa sem že premaknil. Na gitu pa sem tudi posodobil mapo podatki, ki sem jo zgleda prejšnič pozabil, tako da bi zdaj moralo biti vse posodobljeno.

Najlepša hvala za pomoč.

katarinabrilej commented 3 years ago

Sem mislila samo, da datoteko poskus.R premakneš v mapo uvoz, datoteko uvoz.r lahko seveda zaenkrat pustiš takšno kot je, da ti je v pomoč.

Glede urejanja tabel:

Imena stolpcev naj bodo brez presledkov, npr. Stevilo_zabelezenih_okuzb namesto Stevilo zabelezenih okuzb. Prav tako naj se imena stolpcev ne začnejo s številko, - pa zamenjaj s _ (npr. v tabeli slovenija torej Prvi_Kvartal_2018 namesto 2018-1.Kvartal).

Tabele drzava.csv, bdp.csv in potrosnja.csv se uvozijo na podoben način, zato bi bilo manj dela, če definiraš funkcijo, ki kot spremenljivko sprejme ime csv datoteke. Potem lahko to funkcijo uporabiš za vse tri tabele.

uvozi <- function(ime_datoteke) {
  ime <- paste0("podatki/",ime_datoteke,".csv")
  tabela <- read_csv(ime, locale=locale(encoding="Windows-1250")) 
  tabela$TIMEPERIOD <- eksel$TIME
  tabela$TIMEPERIOD[tabela$TIMEPERIOD == "Germany (until 1990 former territory of the FRG)"] <- iconv("Germany")
  tabela$TIMEPERIOD[tabela$TIMEPERIOD == "European Union - 27 countries (from 2020)"] <- iconv("European Union")
  return(tabela)
}
drzava <- uvozi("drzava")
bdp <- uvozi("bdp")
potrosnja <- uvozi("potrosnja")

Če želiš odstraniti vrstice, je najlažje, da to narediš kar na vsaki tabeli posebej:

bdp <- bdp[-c(9,10,15),]
potrosnja <- potrosnja[-c(9,10,15),]
drzava <- drzava[-c(9,10,15),]

Druga možnost bi recimo bila funkcija oblike:

odstrani <- function(tabela){
  tabela <- tabela[-c(9,10,15),]
}

bdp <- odstrani(bdp)
drzava <- odstrani(drzava)
potrosnja <- odstrani(potrosnja)

V primeru, ko uporabiš lapply imaš več dodatnega dela, saj jo najprej uporabiš na seznamu tabel, potem pa moraš te tabele še nekako dobiti ven in jih pretvoriti v data.frame.

Glede preimenovanja stolpcev se mi zdi trenutno način popolnoma ustrezen (samo imena stolpcev naj bodo v skladu z zgornjim).

Kaj pa si želel narediti s funkcijo urejanje.podatkov?

juresternad commented 3 years ago

Super, ravno z definicijo funkcije za uvoz sem imel probleme. Zdaj, ko sem naredil kot zgoraj , pa deluje tako kot sem hotel. Popravil sem tudi imena stolpcev, odstranjevanje vrstic pa sem dal kar v funkcijo uvoza in lepo deluje.

S funkcijo urejanje.podatkov sem poskušal podatke v tabelah bdp, drzava, potrosnja, ki so v obliki npr. "1234.56e" spraviti v obliko "1234,56", saj "e" pomeni "estimated" in sem to mislil zanemariti, ker bi kasneje s temi podatki tudi računal. Funkcija, ki je trenutno napisana pa mi odreže tudi neceli del števila, česar nočem. Imaš mogoče še kakšno idejo kako bi mi to uspelo narediti? Podobno sem mislil napisati tudi funkcijo, ki bi v tabeli "zdruzeni" podatke v stolpcema stevilo_zabelezenih_okuzb in populacija iz oblike "12,34" pretvorila v "12.34", saj bi tudi te podatke kasneje uporabil za računanje.

katarinabrilej commented 3 years ago

V funkciji uvozi je vejica na napačnem mestu, ker želiš odstraniti vrstice in ne stolpce. Pravilno je torej:

tabela <- tabela[-c(9,10,15),]

Tabela Zdruzeni je definirana kasneje kot pa jo urejaš, tako da moraš samo obrniti vrstni red kode.

Glede urejanja podatkov:

najprej moraš še pri samem uvozu dodati kateri znaki predstavljajo NA, v tvojem primeru je to dvopičje. Spremeniš naslednjo vrstico:

 tabela <- read_csv(ime, locale=locale(encoding="Windows-1250"), na = c(":")) 

Same številke bo pa najlažje urediti, če najprej tabelo spremeniš v obliko tidy data (kot morajo vse biti na koncu). Na koncu funkcije uvozi torej dodaš

tabela <- tabela %>% pivot_longer(!TIMEPERIOD, names_to="Kvartal", values_to="Stevilo")

Zdaj moraš popraviti samo en stolpec:

  tabela$Stevilo <- str_extract(tabela$Stevilo, "\\d+\\.*\\d*")
  tabela$Stevilo <- as.numeric(tabela$Stevilo)

Končna funkcija uvozi torej zgleda nekako tako:

uvozi <- function(ime_datoteke) {
  ime <- paste0("podatki/",ime_datoteke,".csv")
  tabela <- read_csv(ime, locale=locale(encoding="Windows-1250"), na = c(":")) 
  tabela$TIMEPERIOD <- eksel$TIME
  tabela$TIMEPERIOD[tabela$TIMEPERIOD == "Germany (until 1990 former territory of the FRG)"] <- iconv("Germany")
  tabela$TIMEPERIOD[tabela$TIMEPERIOD == "European Union - 27 countries (from 2020)"] <- iconv("European Union")
  tabela <- tabela[-c(9,10,15),]

  tabela <- tabela %>% pivot_longer(!TIMEPERIOD, names_to="Kvartal", values_to="Stevilo")
  tabela$Stevilo <- str_extract(tabela$Stevilo, "\\d+\\.*\\d*")
  tabela$Stevilo <- as.numeric(tabela$Stevilo)

  return(tabela)
}
juresternad commented 3 years ago

Sem popravil in preuredil kodo, v tabele pa sem dodal tudi stolpce, ki kažejo povprečno rast bdp, potrosnje in drzave. Ali lahko prosim pogledaš, če so tabele zdaj v pravilni obliki, ali bi jih moral spraviti v drugačno obliko?

katarinabrilej commented 3 years ago

Sem pogledala in se mi zdi, da so tabele v primerni obliki. Morda edino ne potrebuješ rasti že kar v originalni tabeli, saj so to neke vrednosti, ki se jih da poračunati iz vrednosti v tabeli. Lahko bi recimo naredil novo tabelo, kjer bi imel samo rasti v letih 2019 in 2020, ampak za vse tri podatke, torej bdb, drzava in potrosnja, če bi recimo to kasneje želel primerjati. Vendar pa je to malo odvisno od tega katere podatke boš želel prikazati, tako da lahko zaenkrat pustiš kot je in boš kasneje videl kaj je najboljše.

juresternad commented 3 years ago

Malo sem vseeno še preuredil tabele, ker sem opazil da prejšnja oblika ni bila najbolj primerna za vizualizacijo podatkov. Vseeno sem pustil podatke o rasti v tabelah. Posodobil sem tudi projekt.Rmd in končal z drugo fazo. Najlepša hvala za vso pomoč!