(Acest articol a fost publicat pentru prima dată pe John Russellși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Sunt tatăl a doi fii; unul de 4,5 ani, iar celălalt este doar câteva luni. Acest lucru poate părea ciudat, dar, deși am trecut prin toate cu primul meu fiu … Am amnezie completă despre ceea ce era normal, cum erau programele de napping și așa cum sunt asemănătoare la această vârstă.
Din fericire, am folosit un tracker pentru copii, care mi -a permis să export un CSV. Ce oportunitate de aur pentru o vizualizare a datelor!
Să încărcăm doar tidyverse
Și aruncă o privire …
Cod în r
library(tidyverse) child <- read_csv("https://github.com/drjohnrussell/drjohnrussell.github.io/raw/refs/heads/master/posts/2025-01-30-plotting-sleep-intervals/data/baby.csv") head(child)
# A tibble: 6 × 3 Baby Time `Duration (min)`1 First-Born 10/23/20 4:30 AM 60 2 First-Born 10/23/20 6:00 AM 55 3 First-Born 10/23/20 8:31 AM 39 4 First-Born 10/23/20 11:13 AM 28 5 First-Born 10/23/20 3:49 PM 14 6 First-Born 10/23/20 7:16 PM 298
Hmmm, bine. Deci, câteva probleme de rezolvat:
-
Time
Coloana este date de caractere, în loc de POSIXCT - Aveți durate, în loc să începeți orele de început și de sfârșit
Ceea ce mi -ar plăcea este un grafic al programului de somn al fiului meu, pe săptămână, că aș putea să mă potrivesc cu al doilea copil. Deci, să vedem ce putem face.
Crearea unui date TIMY TIME
Primul lucru de făcut este să vă asigurați că datele sunt la timp. R are multe funcții, pe care le adaptați la modul în care arată datele. Aici, datele sunt în LUNI/ZIUA/ANI ORA: MINUTSdeci putem folosi mdy_hm
ca funcție.
Cod în r
child <- child |> mutate(starttime=mdy_hm(Time)) |> select(-Time) head(child)
# A tibble: 6 × 3 Baby `Duration (min)` starttime1 First-Born 60 2020-10-23 04:30:00 2 First-Born 55 2020-10-23 06:00:00 3 First-Born 39 2020-10-23 08:31:00 4 First-Born 28 2020-10-23 11:13:00 5 First-Born 14 2020-10-23 15:49:00 6 First-Born 298 2020-10-23 19:16:00
Putem converti în mod similar durata în minute și o adăugăm la starttime pentru a obține o sfârșit de timp folosind minutes
funcţie
Cod în r
child <- child |> mutate(endtime=starttime+minutes(`Duration (min)`)) |> select(-`Duration (min)`) head(child)
# A tibble: 6 × 3 Baby starttime endtime1 First-Born 2020-10-23 04:30:00 2020-10-23 05:30:00 2 First-Born 2020-10-23 06:00:00 2020-10-23 06:55:00 3 First-Born 2020-10-23 08:31:00 2020-10-23 09:10:00 4 First-Born 2020-10-23 11:13:00 2020-10-23 11:41:00 5 First-Born 2020-10-23 15:49:00 2020-10-23 16:03:00 6 First-Born 2020-10-23 19:16:00 2020-10-24 00:14:00
Separarea somnului noaptea
Pentru graficul pe care mi -l imaginez, unde dreptunghiurile pe un complot în care arată timpul să doarmă, fiul meu dormind toată noaptea va fi de fapt două dreptunghiuri; Una care merge seara până la miezul nopții, apoi una a doua zi de la miezul nopții până se trezește.
Acest lucru apare în setul de date ca cele în care în ziua starttime
şi endtime
sunt diferite.
Cod în r
childnight <- child |> filter(day(starttime) != day(endtime)) ## now make these into two different datasets. The evening dataset and the morning dataset childevening <- childnight |> mutate(endtime= make_datetime(year(starttime), month(starttime), day(starttime), hour=23, min=59, sec=59)) childmorning <- childnight |> mutate(starttime= make_datetime(year(endtime), month(endtime), day(endtime), hour=0, min=0, sec=0)) ## now filter them out and bind back in child <- child |> filter(day(starttime) == day(endtime)) |> bind_rows(childevening,childmorning)
Acum avem un set de date! Următoarea problemă.
Traducerea datelor în vechime de săptămâni
Deoarece cei doi fii ai mei nu s -au născut în aceeași zi (sau chiar în aceeași lună), privirea datelor până la dată nu va fi de ajutor; În mod ideal, vreau să -l privesc la câte săptămâni sunt.
Cod în r
birth <- mdy("05-30-20")
Folosind această dată de naștere, pot găsi diferența de timp între vremurile dormind și nașterea lui. Folosind floor
Funcția este asemănătoare cu rotunjirea, ceea ce îmi va permite să văd câte săptămâni a avut copilul când a avut loc somnul.
În mod ideal, vreau ca aceste date să fie convertite în vechime în ce săptămână și în ce zi din acea săptămână, am avut în vedere un complot care merge de la miezul nopții până la miezul nopții. Fiul meu s -a născut într -o duminică, așa că acest lucru poate merge de duminică până sâmbătă.
Cod în r
child <- child |> mutate( ## this tells you how many weeks old weeksold=floor(difftime(starttime, birth, units="weeks")), ## this translates the dates into days of the week dayweek=wday(starttime,label=TRUE, ##labels over numbers, abbr=TRUE, ##abbreviated, week_start=7 ## Sunday ), starthour=hm(paste0(hour(starttime),":",minute(starttime))), endhour=hm(paste0(hour(endtime),":",minute(endtime)))) |> select(-c(starttime,endtime)) head(child)
# A tibble: 6 × 5 Baby weeksold dayweek starthour endhour1 First-Born 20 weeks Fri 4H 30M 0S 5H 30M 0S 2 First-Born 20 weeks Fri 6H 0M 0S 6H 55M 0S 3 First-Born 20 weeks Fri 8H 31M 0S 9H 10M 0S 4 First-Born 20 weeks Fri 11H 13M 0S 11H 41M 0S 5 First-Born 20 weeks Fri 15H 49M 0S 16H 3M 0S 6 First-Born 21 weeks Sat 49M 0S 7H 20M 0S
Acum suntem gata de grafic!
Grafic
geom_rect
Nu funcționează bine cu date categorice, așa că vom folosi faptul că factorii au comenzi numerice sub ele pentru a grafic.
Acest lucru creează un prim grafic amuzant.
Cod în r
child |> filter(weeksold %in% c(21:29)) |> ggplot() + geom_rect(mapping=aes(xmin=as.numeric(dayweek)-.45, xmax=as.numeric(dayweek)+.45, ymin=starthour, ymax=endhour), fill="blue", alpha=.5) + facet_wrap(~weeksold)
Observați că axa y este în câteva secunde de la miezul nopții și că axa X este în zile de duminică. Să lucrăm cu cântarul nostru pentru a face acest lucru corect
Cod în r
BREAKS <- c(0:12) * 7200 ## there are 3600 seconds in an hour, so this should make breaks every 2 hours child |> filter(weeksold %in% c(21:29)) |> ggplot() + geom_rect(mapping=aes(xmin=as.numeric(dayweek)-.45, xmax=as.numeric(dayweek)+.45, ymin=starthour, ymax=endhour), fill="blue", alpha=.5) + facet_wrap(~weeksold) + scale_y_time(breaks=BREAKS) + scale_x_continuous( breaks=seq_along(levels(child$dayweek)), labels=levels(child$dayweek) ) + labs(title="Sleep Schedule by Weeks Old, Weeks 21-29") + theme_light()
Un grafic de care să fiu mândru și un amintire că primul meu fiu a fost un somn mult mai bun noaptea decât actualul meu …