|
|
Rivi 59: |
Rivi 59: |
|
| |
|
|
| |
|
| <rcode graphics=0 name="output" embed=1 showcode=0 label="Hae kirjauksia" variables=" | | <rcode graphics=0 name="output" embed=0 showcode=0 label="Hae kirjauksia" variables=" |
| category:Hae kirjauksia| | | category:Hae kirjauksia| |
| name:alku|description:Seurantajakson alku|type:date|default:2014-02-06| | | name:alku|description:Seurantajakson alku|type:date|default:2014-02-06| |
Rivi 66: |
Rivi 66: |
| name:projekti|description:Projekti|type:selection|options: | | name:projekti|description:Projekti|type:selection|options: |
| 'Kaikki';Kaikki; | | 'Kaikki';Kaikki; |
| | 'Näkemysverkko';Näkemysverkko: |
| 'STM raportointi ja laskutus';STM raportointi ja laskutus; | | 'STM raportointi ja laskutus';STM raportointi ja laskutus; |
| 'EU raportointi ja laskutus';EU raportointi ja laskutus; | | 'EU raportointi ja laskutus';EU raportointi ja laskutus; |
Rivi 130: |
Rivi 131: |
| | | |
| | | |
| dat <- dat[dat$Henkilö %in% tekijä , ] | | if(tekijä!='Kaikki') dat <- dat[dat$Henkilö %in% tekijä , ] |
| | | |
| | | |
Rivi 137: |
Rivi 138: |
| ulos <- työ[työ$Työ == "Ulos" , ] | | ulos <- työ[työ$Työ == "Ulos" , ] |
| työ <- työ[työ$Työ != "Ulos" , ] | | työ <- työ[työ$Työ != "Ulos" , ] |
| | | #oprint(työ) |
| | #oprint(ulos) |
| if (length(työ$Työ) > length(ulos$Työ)) {työ <- työ[-((nrow(ulos)+1):nrow(työ)), ] | | if (length(työ$Työ) > length(ulos$Työ)) {työ <- työ[-((nrow(ulos)+1):nrow(työ)), ] |
| työ$Loppu <- ulos$Aika | | työ$Loppu <- ulos$Aika |
Rivi 189: |
Rivi 191: |
| } | | } |
|
| |
|
| if (tekijä != "Kaikki") tekijä <- gsub("\\s", "", unlist(strsplit(tekijä, ","))) else tekijä <- c("Sharp", "Heta", "Pauli", "Jaakko", "Mori", "Julia") | | if (tekijä != "Kaikki") tekijä <- gsub("\\s", "", unlist(strsplit(tekijä, ","))) # else tekijä <- c("Sharp", "Heta", "Pauli", "Jaakko", "Mori", "Julia") |
| kirjausajat(alku, loppu, tekijä, projekti) | | kirjausajat(alku, loppu, tekijä, projekti) |
|
| |
|
+ Näytä koodi- Piilota koodi
library(OpasnetUtils)
library(ggplot2)
objects.latest("Op_en6007", code_name = "answer") # We need timing
kirjausajat <- function(alku, loppu, tekijä, projekti){
dat <- opbase.data("Op_fi3948", subset = 'Kirjaukset')
poistot <- opbase.data("Op_fi3948", subset = 'Kirjauspoistot')
# pois <- as.numeric(as.character(poistot$Kirjausnro)) # Varoitus nousee tästä, kun yritetään muuttaa numericiksi ei-numeerinen.
# Varoitus tulee arvosta k1 mutta tällä ei ole käytännön merkitystä. Varoitus ei ole virhe eikä toiminta keskeydy.
#
# pois <- subset(pois, pois > 0)
# dat <- dat[-pois , colnames(dat) != "Result"] # Tässä kohti voisi käyttää %in%iä, mutta dat[dat %in% poistot$Kirjausnro , ]
# # ei ainakaan toiminut. En siis tiedä, miten kutsua dat:in rivinumerosaraketta.
#
# dat on data.frame ja siksi et voi käyttää sitä vertailussa vektoriin. Sen sijaan 1:nrow(dat) tuottaa juoksevan rivinumeroinnin dat:lle.
# Kirjausnro puolestaan pitää muuttaa numeroiksi, jotta sitä voi verrata rivinumeroihin. Suositeltavampi tyyli on tämä:
pois <- as.numeric(levels(poistot$Kirjausnro)[poistot$Kirjausnro])
dat <- dat[!1:nrow(dat) %in% pois , colnames(dat) != "Result"]
#tuntikirjaus <- opbase.data("Op_fi3950.tuntikirjaus")
#työtehtävät <- opbase.data("Op_fi3950.tyotehtavat")
#työsuunnitelma <- opbase.data("Op_fi3950.tyosuunnitelma")
#tuntikirjaus <- tuntikirjaus[colnames(tuntikirjaus) != "Obs"]
#työtehtävät <- työtehtävät[colnames(työtehtävät) != "Obs"]
#työsuunnitelma <- työsuunnitelma[colnames(työsuunnitelma) != "Obs"]
#colnames(työsuunnitelma)[colnames(työsuunnitelma) == "Result"] <- "Loppu"
#työsuunnitelma <- data.frame(työsuunnitelma, Henkilö = "Jouni")
if(tekijä!='Kaikki') dat <- dat[dat$Henkilö %in% tekijä , ]
molemmat <- dat[dat$Loppu != "NA" , ]
työ <- dat[dat$Loppu == "NA" , ]
ulos <- työ[työ$Työ == "Ulos" , ]
työ <- työ[työ$Työ != "Ulos" , ]
#oprint(työ)
#oprint(ulos)
if (length(työ$Työ) > length(ulos$Työ)) {työ <- työ[-((nrow(ulos)+1):nrow(työ)), ]
työ$Loppu <- ulos$Aika
} else työ$Loppu <- ulos$Aika
työ <- rbind(työ, molemmat)
if (projekti != "Kaikki") työ <- työ[työ$Työ == projekti , ]
työ$Aika <- as.POSIXct(työ$Aika, tz = 'Europe/Helsinki')
työ$Loppu <- as.POSIXct(työ$Loppu, tz = 'Europe/Helsinki')
työ <- työ[
työ$Aika >= as.POSIXct(alku, tz = 'Europe/Helsinki') &
työ$Aika <= as.POSIXct(loppu, tz = 'Europe/Helsinki') +3600*24 ,
]
työaika <- (sum(as.numeric(työ$Loppu))-sum(as.numeric(työ$Aika)))
työaika <- (round(työaika/3600, digits = 2))
cat("Valitulla välillä tehty työaika on yhteensä ", työaika, " tuntia. \n")
työ$Aika <- as.character(työ$Aika)
työ$Loppu <- as.character(työ$Loppu)
oprint(työ)
#oprint(työsuunnitelma)
#oprint(työtehtävät)
#out <- poistot
#oprint(out)
#tuntikirjaus <- timing(tuntikirjaus, timecol = c("Aika", "Loppu"), weeks = 6)
#timeline <- makeTimeline(tuntikirjaus)
#timeline <- timeline[order(timeline$Time) , ]
#timeline$Time[nrow(timeline)] <- max(timeline$Time, na.rm = TRUE)
#for(i in 1:(nrow(timeline)-1)) {timeline$end[i] <- timeline$Time[i+1]}
#timeline[nrow(timeline), "end"] <- NA
#timeline$end <- as.POSIXct(timeline$end, origin = "1970-01-01")
#ggplot(timeline, aes(
# xmin = Time, # as.Date(as.character(Start))
# xmax = end, # as.Date(as.character(End)) + 2
# ymin = as.numeric(Henkilö),
# ymax = as.numeric(Henkilö) + 1,
# fill = Työ)) + geom_rect()
#
}
if (tekijä != "Kaikki") tekijä <- gsub("\\s", "", unlist(strsplit(tekijä, ","))) # else tekijä <- c("Sharp", "Heta", "Pauli", "Jaakko", "Mori", "Julia")
kirjausajat(alku, loppu, tekijä, projekti)
#objects.store(output, kirjausajat)
# Periaatteena on kaksi koodia: initiate luo funktiot, ovariablet ja muut yleiskäyttöiset oliot ja tallentaa ne serverille.
# Käyttökoodi answer kutsuu noita olioita ja suorittaa niillä tapauskohtaisia toimenpiteitä. Koska tämä on tapauskohtainen
# koodi, ei kannata tallentaa olioita (ethän kutsu niitä missään). Kunhan koodi on vakiintunut, kannattaa se jakaa
# yleiseen ja projektikohtaiseen. Esimerkiksi tekijöiden tunnukset kannattaa ottaa funktioon parametriksi, jotta funktio
# olisi yleispätevä, ja parametrin arvo kerrotaan projektikohtaisessa koodissa.
| |
Aikakoneen laskenta
Tässä on siistitty ja dokumentoitu versio Aikakoneen makeTimeline-funktiosta, joka ottaa sisäänsä työajan alku- ja loppuaikoja ja tuottaa aikajanan. Funktion olennainen lisäarvo on siinä, että sille voi antaa päällekkäisiä ajanjaksoja, ja se korvaa vanhemmat kirjaukset (eli ylempänä taulukossa olevat) uudemmilla, jos niiissä on päällekkäisyyksiä. Toinen lisäarvo on se, että se automaattisesti käsittelee jokaisen henkilön ajankäyttöä erikseen, mutta muiden indeksien suhteen se vain periyttää tiedot aikajanalle. Muita indeksejä voi siis käyttää tarpeen mukaan.
----#: . Kehityskohteita: tarvitaanko koskaan tilannetta, jossa henkilösarakkeita onkin useita? Ei liene tärkeä, vaan tarvittaessa tämä toteutetaan luomalla tämmöinen sarake etukäteen. --Jouni Tuomisto (keskustelu) 15. heinäkuuta 2014 kello 08.28 (UTC) (type: truth; paradigms: science: comment)
+ Näytä koodi- Piilota koodi
library(OpasnetUtils)
makeTimeline2 <- function (
events, # data.frame with time cols (start and end) and possibly other indices. One index may separate individuals.
cols = c("Alku", "Loppu"), # Names of the start and end time columns
personcol = NULL # Name of the column defining individuals, if any
) {
if (!is.numeric(events[cols[1]])) { # If not numeric, assume a time format.
for (m in 1:2) {
events[[cols[m]]] <- as.POSIXct(events[[cols[m]]], tz = "Europe/Helsinki")
}
}
if(is.null(personcol)) { # Make a temporary column for individuals
personcol <- "Persontemp"
events$Persontemp <- "Temp"
}
out <- data.frame()
for(k in as.character((unique(events[[personcol]])))) { # Look at each individual's events separately.
event <- events[events[[personcol]] == k , colnames(events) != personcol]
# timeline is a data.frame with all starts and ends as one timeline.
# Events down in the "event" data.frame replace previous events higher in "event", if they overlap.
timeline <- data.frame(Time = min(event[[cols[1]]]), Eventrow = nrow(event) + 1) # First time point
for (i in 1:nrow(event)) { # Go through each row and replace the time slot in timeline with the event.
temp <- data.frame(
Time = event[i , cols[1]],
End = event[i , cols[2]],
EventrowStart = i # Eventrows are used temporarily. In the end they are replaced with all indices in event.
)
# Add new time points to the timeline with the event row mentioned.
timeline <- merge(timeline, temp[c("Time", "EventrowStart")], all = TRUE)
colnames(temp) <- c("Remove", "Time", "EventrowEnd")
timeline <- merge(timeline, temp[, c("Time", "EventrowEnd")], all = TRUE)
# Go through intermediate time points and replace them with the new event.
for (j in 2:nrow(timeline)) {
if (is.na(timeline$Eventrow[j])) {
timeline$Eventrow[j] <- timeline$Eventrow[j - 1]
}
if (is.na(timeline$EventrowStart[j]) & is.na(timeline$EventrowEnd[j])) {
timeline$EventrowStart[j] <- timeline$EventrowStart[j - 1]
}
}
# If the Eventrow is not a start, it must be an end.
timeline$Eventrow <- ifelse(!is.na(timeline$EventrowStart), timeline$EventrowStart, timeline$Eventrow)
timeline <- timeline[, c("Time", "Eventrow")]
}
# Add one row for the last timepoint.
event <- rbind(event, rep(NA, ncol(event)))
event[nrow(event) , cols[1]] <- max(timeline$Time)
event$Eventrow <- row(event)[ , 1]
# Bring back the other indices from event.
timeline <- merge(timeline, event)
timeline <- timeline[order(timeline$Time), ]
timeline <- timeline[!colnames(timeline) %in% c("Eventrow", cols)]
if(personcol != "Persontemp") timeline[[personcol]] <- k
out <- rbind(out, timeline)
}
# Calculate the durations of each time slot in the timeline.
out$Duration <- out$Time[c(2:nrow(out), NA)] - out$Time
# Remove the last duration value from each individual's timeline.
temp <- out[[personcol]]
out$Duration <- ifelse(temp[c(2:length(temp), NA)] != temp | 1:length(temp) == length(temp), 0, out$Duration)
return(out)
}
events <- data.frame(
Projekti = c("LVM", "LVM", "Pneumokokki"),
Alku = c("2014-07-14 12:00", "2014-07-15 13:00", "2014-07-14 12:30"),
Loppu = c("2014-07-14 14:00", "2014-07-15 14:15", "2014-07-15 14:00"),
Person = c("Heikki", "Ville", "Ville")
)
dat <- makeTimeline2(events, cols = c("Alku", "Loppu"), personcol = "Person")
cat("Lähtödata\n")
oprint(events)
cat("Aikajana. Tapahtumien kestot ovat minuutteina.\n")
dat$Time <- format(dat$Time) # Convert times from POSIXct to character.
oprint(dat)
| |