Closed Zulkinho closed 7 years ago
Pretvorba bi šla nekako takole:
options(digits.secs = 3)
ultimatetabela <- inner_join(ultimatetabela, ultimatetabela %>% filter(Pos == 1) %>%
select(prvi = `Time/Retired`, Circuit)) %>%
mutate(`Time/Retired` = (as.POSIXct(prvi, format = "%H:%M:%OS") +
ifelse(Pos == 1, 0,
gsub(".*?([0-9.]+).*", "\\1", `Time/Retired`)) %>%
as.numeric()) %>% strftime("%H:%M:%OS")) %>% select(-prvi)
Prvi ukaz nastavi, naj se sekunde prikazujejo s tremi decimalkami. Potem se naredi join s tabelo časov zmagovalcev, tem se pa prištejejo zaostanki (oziroma 0 za zmagovalca). Nazadnje se dobljeni čas (ki vključuje tudi datum, ki ga pa ne potrebujemo) pretvori v niz želene oblike, ki ga bo Postgres razumel kot interval. Kot rečeno v #5, naj bo stolpec time
tipa INTERVAL
. Tako boste lahko računali s časi - lahko npr. v aplikaciji spet izpišete zaostanke, kot v vhodnih podatkih (treba bo narediti podoben join kot zgoraj). Seveda lahko tudi vrednosti NA
nadomestite z ustreznimi vrednostmi (nekatere stolpce bo morda treba pretvoriti v nize).
Datum se v tabeli prikaže kot število, ker je tako notranje predstavljen. Da se prikaže kot datum, ga bo potrebno pretvoriti v niz, npr.
c$date <- as.character(c$date)
Lahko pa uporabite tudi strftime
, s katerim lahko kontrolirate tudi način izpisa datuma. Mimogrede, c
ni najbolj posrečena izbira imena za razpredelnico, saj je tako v R-ju ime funkciji za stikanje vektorjev.
Svetoval bi še, da poskrbite za lep izpis imen stolpcev v tabelah. To lahko dosežete s funkcijo rename
, npr.
d %>% rename(Country = country, Constructor = constructor,
Chassis = chassis, `Power unit` = power_unit)
Še eno stvar sem opazil: nekateri dirkači se pojavijo v dveh ekipah, zaradi česar se njihovi rezultati izpišejo podvojeno. Da do tega ne bo prihajalo, svetujem, da v tabelo has
dodaste še dva stolpca, ki povesta prvo in zadnjo dirko pri navedeni ekipi (naj bosta kar tuja ključa na ID dirke). Podatke za to tabelo lahko potem dobite tako:
data.has <- ultimatetabela %>% inner_join(tabelaekip, by = c("Car" = "Constructor")) %>%
group_by(št, No) %>% summarise(first = min(Circuit), last = max(Circuit))
Da bo to pravilno delovalo, bo treba poskrbeti, da je stolpec Circuit
številski - najlažje to naredite pri predhodni definiciji razpredelnice ultimatetabela
(npr. mutate(Circuit = as.numeric(Round))
). Ko boste imeli te podatke, boste lahko rezultate filtrirali tako, da se bo prikazala samo ekipa, za katero je dirkač nastopal na izbrani dirki.
Prvi dve stvari sem naredil in je vse ok.
Pri zadnji stvari (podvajanju) pa imam težavo. Dodal sem v ultimatetabela mutate(Circuit = as.numeric(Round)) v has dodal dva stolpca. Sedaj pa ko hočem filtrirati v tabeli "e" z e <-e %>% filter(last >= round >= first) mi javi error.
Zanima me če sem vse korake naredil pravilno kot ste mi naročili.
Meji je treba podati kot ločena pogoja - to je treba storiti pred select
, kjer se stolpca first
in last
izpustita, ter pred pretvorbo v data.frame
, da se filter izvede na bazi (sicer se izvede šele lokalno):
e <- eeeee %>% filter(name.y == input$results, last >= round, round >= first) %>%
select(position,start_position,car_number,name.x,surname,laps.x,time, points,team_name) %>%
data.frame()
V ui.R
imate na dveh mestih presledek pred Italian Grand Prix
- pobrišite ga, da bo pokazalo podatke tudi za to dirko.
V tabela.R
imate nerazrešen konflikt (vrstice 397 - 401) - vrstici se razlikujeta le v enem presledku, tako da je vseeno, katero vzamete. Sicer pa lahko prvi mutate
izpustite, saj z naslednjim prepišete stolpec Circuit
. Prav tako lahko izpustite prvo (staro) definicijo data.has
.
Drugače izgleda v redu, tako da se lahko s profesorjem domenite za termin zagovora. Ko boste imeli vse končano, mi javite, da dam povezavo na repozitorij predmeta.
Mimogrede, dirkači se lahko ponovijo tudi pri seznamu po državah. Da se podatki ne bodo ponavljali, pač pa se bodo samo naštele ekipe, lahko naredite nekaj takega:
a <- aaa %>% filter(country.x == input$drzava) %>%
group_by(name, surname, car_number, age, height, weight) %>%
summarise(team_name = paste(team_name, collapse = ", ")) %>% data.frame()
Sem popravil stvari, tako da smo zaključili.
Iskrena hvala za vso pomoč, ki Ste nam jo ponudili. Lep pozdrav in srečno.
V redu, sem dodal povezavo. Če boste še kaj spreminjali, mi prosim javite, da jo posodobim.
Bolj kot ne smo zaključili s projektom. Upam, da vam bo aplikacija delovala tako kot nam. Le še nekaj malenkosti je, pri katerih bi potrebovali nasvet:
Pri pretvorbi časa iz +1.345s v obliko 01:23:45.678 imate morda kakšen nasvet kako bi to lahko naredili?
Pri aplikaciji pri greand prix me zanima zakaj aplikacija vrže dadtum kot 16880.00 in ne kot je v bazi ? Bi mi lahko pomagali kaj naj naredim, da bo kazalo pravilno.
Že v naprej hvala! Lep pozrav