Lucrând cu timpul pentru a lupta împotriva amneziei bebelușului

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(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)` starttime          
                                 
1 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           endtime            
                                   
1 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  endhour   
                   
1 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)

Un complot cu numere pe fiecare parte …

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 complot final

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 …

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.