nezahabjan / APPR-2017-18

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

pridobitev tabele iz wikipedije #2

Open nezahabjan opened 6 years ago

nezahabjan commented 6 years ago

Pozdravljeni,

pri projektu za APPR imam težave s pridobitvijo tabele iz wikipedije, saj ne najdem prave značke, v kateri je tabela shranjena in zato ne znam uporabiti postopka, ki je naveden v vzorčnem repozitoriju. Prosila bi Vas za pomoč, povezava do članka na Wikipediji je: "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy#List_by_the_United_Nations,_for_2010%E2%80%932015", in sicer bi rada dobila drugo tabelo na tej spletni strani (List by the United Nations, 2010 - 2015).

Najlepša hvala in lep pozdrav,

Neža Habjan

jaanos commented 6 years ago

Gre za drugo tabelo z atributom class="wikitable sortable", torej jo uvoziš z

link <- "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy"
tabela <- html_session(link) %>% read_html() %>%
  html_nodes(xpath="//table[@class='wikitable sortable']") %>% .[[2]] %>% html_table()

Seveda bo potrebno podatke še pretovriti v obliki tidy data.

Še to: v libraries.r imaš ukaz install.packages - tega prosim odstrani, saj ne želiš, da se knjižnica poskusi namestiti ob vsakem prevajanju poročila. Namesto tega samo poskrbi, da imaš knjižnice nameščene na računalnikih, kjer delaš. Odstrani tudi uvoz knjižnice reshape, saj potem funkcija melt ne bo delovala pravilno.

V uvoz.r mi zdaj ne deluje uvoz iz JSON - očitno se je oblika podatkov nekoliko spremenila. Treba bo torej nekoliko popraviti uvoz - skupaj z nadaljnjo obdelavo bi šlo tako:

matrika <- json$Matrix %>% sapply(. %>% sapply(. %>% .$disp)) %>% t()
glava <- . %>% .$header %>% lapply(. %>% .[-1, 2] %>% { json$code[.+1, ] } %>% .$disp)
stolpci <- json$Vertical$layer %>% unlist() %>% { json$dimension[.+1, ] } %>% .$disp
colnames(matrika) <- glava(json$Horizontal) %>% sapply(paste, collapse = ",")
data <- glava(json$Vertical) %>% lapply(. %>% as.list() %>% setNames(stolpci)) %>%
  bind_rows() %>% cbind(matrika) %>% melt(id.vars = 1:3) %>%
  mutate(Country = factor(Country), Year = parse_number(Year),
         value = parse_character(value, na = "No data"),
         variable = parse_character(variable)) %>% drop_na(value) %>%
  mutate(Spol = variable %>% strapplyc("([^,]+)$") %>% unlist() %>% factor(),
         Povprecje = value %>% strapplyc("^([0-9.]+)") %>% unlist(),
         `Spodnja meja` = value %>% strapplyc("\\[([0-9.]+)") %>% unlist(),
         `Zgornja meja` = value %>% strapplyc("([0-9.]+)\\]") %>% unlist()) %>%
  select(-variable, -value) %>% melt(measure.vars = c("Povprecje", "Spodnja meja", "Zgornja meja"),
                                     variable.name = "Vrednost",
                                     value.name = "Stevilo") %>%
  mutate(Stevilo = parse_number(Stevilo)) %>% rename(Drzava = Country) %>%
  filter(Vrednost == "Povprecje",
         Drzava %in% c("Belgium",
                       "Bosnia and Herzegovina",
                       "Denmark",
                       "Finland",
                       "Germany",
                       "Greece",
                       "Italy",
                       "Latvia",
                       "Slovenia",
                       "France",
                       "Luxembourg",
                       "Bulgaria")) %>% select(-Year, -`Age Group`, -Vrednost)

Treba bo torej samo še prevesti spole.

Kolikor vidim, je funkcija uvozi.starost odveč, tako da jo odstrani. Prav tako odstrani klicanje funkcij iz vzorca na koncu.