Organisering af projekter (i R)

Scripts, kode og data-filer kan hurtigt at blive et gevaldigt rod, hvor man kæmper med at finde det rigtige script og finde ud af, om det læser fra det rigtige datasæt, hvis ikke man har et system til at holde lidt snor i det hele. Det er som regel ikke noget man trænes i på universitet (det var det i hvert fald ikke da jeg læste), men heldigvis er det også relativt nemt at lære - eller i hvert fald at forbedre!

Jeg vil her præsentere et eksempel på, hvordan man kan organisere sine mapper og filer, når man lave et analyse-projekt i R. Selvom nogle ting vil være specifikke for R, så vil nogle af principperne helt sikkert også kunne bruges, hvad end man arbejder i Stata, SAS, Excel, Python og hvad der ellers er af programmer til dataanalyse eller data science om man vil.

I R starter jeg altid et nyt projekt med at lave en ny mappe, hvori jeg opretter et såkaldt R-project. I RStudio kan man lave sådan et gennem File -> New Project -> Existing Directory og så vælger jeg den nye mappe, som jeg har oprettet til projektet. Jeg har lagt nogle filer ind i projektet for at illustrere, hvordan mappe/fil strukturen kan se ud i et organiseret projekt. 

.                                         

 ¦--my_project.Rproj                     

 ¦--notebooks                             

 ¦         --01_prepare_rawdata.nb.html       

 ¦         --01_prepare_rawdata.Rmd           

 ¦         --02_explorary_data_analysis.nb.html   

 ¦         --02_explorary_data_analysis.Rmd   

 ¦         --03_econometric_analysis.nb.html   

 ¦        --03_econometric_analysis.Rmd       

 ¦--prepared_data                         

 ¦        --cars_prepared.tsv                 

 ¦--rawdata                               

 ¦        --cars.rds                         

Det øverste punktum angiver mappen, vi befinder os i. Det er det såkaldte root-directory, hvori min Rproj-fil ligger, som genereres, når jeg opretter et nyt projekt. Det angiver hovedmappen - eller det øverste niveau for projektets mappestrukter. Derefter har tre projektet tre undermapper: notebooks, prepared_data og rawdata. 

I mit rawdata gemmer jeg data, som jeg får det i sit rå-format. Data i denne mappe skal ikke overskrives. Data i det format, det nu engang skal bruges i en analyse, ligger jeg i mappen prepared_data. 

Et script eller en notebook dokumenterer de trin, der er taget for at gå fra rå-data til prepared-data. Det angives tydeligt i navngivningen på mit script/notebook, hvor dette foregår (01_prepare_rawdata.Rmd). Generelt er det en fordel at undgå mellemrum og skelnen mellem store og små bogstaver. Det vil typisk sikre, at scripts eller data kan køres eller læses fra andre programmer, der ikke nødvendigvis håndtere mellemrum særlig godt eller ikke er case-sensitive. Måske spiller dette ingen rolle for dit nuværende projekt, men det er en god vane at tillære sig.

Endelig er der notebooks-mappen. I denne mappe ligger alle scripts/notebooks, som jeg bruger i forbindelse med at klargøre rådata, undersøge data og lave (for eksempel) økonometrisk analyse. Alt efter smag og projektet størrelse, kan det i nogle tilfælde være en fordel at lave flere undermapper (nogle foretrække måske en mappe, som hedder "data" med undermapperne "rawdata" og "prepared_data" eller lign.)

Mine notebooks hedder ikke nødvendigvis altid det samme og ligger heller ikke nødvendigvis i samme rækkefølge. Det vigtige er dog:

  1.  de navngives fornuftigt 
  2.  de nummereres 

Både navngivning og nummerering er vigtig for at man kan holde styr på rækkefølgen koden skal køres i, hvad end det er ens kollega, studiekammarat eller en selv om et halvt år, der skal skabe sig overblik over projektet. 

Indtil videre har jeg ikke præsenteret nogle særlige grunde til, hvorfor jeg oprettet et R-project (.Rproj-filen). Mappe/fil strukturen afhænger heller ikke af, at laver et R-project. Fordelene ved at lave et R-project er følgende: 

  1.  Man kan nu anvende relative fremfor absolutte-stier. 
  2.  Man kan sikre koden altid er i samme formattering (vælg UTF-8!: er ofte default, men ellers: Tools -> Project-options -> Code editing -> Text Encoding), hvilket vil være en stor lettelse for dem, som har oplevet æåø bliver omdannet til smiley'er eller et virvar af specialtegn, når de genåbner et script. 
  3. Der er en relativ nemt at sætte projektet op til versioneringssystemer som Git.

Med absolutte stier skal man skrive hele stiens navn til filen man gerne vil indlæse. Med relative stier, tages der udgangspunkt i den mappe scriptet befinder sig. Eksempelvis ville jeg i 01_prepare_rawdata.Rmd skrive "readRDS(../rawdata/cars.rds)", hvor "../" betyder, at jeg bare bevæger mig et niveau op fra mappen mit script befinder sig i. Hvis jeg så eksempelvis får behov for at rykke projektet til et andet sted eller jeg deler det med en kollega, så vil alle relative stier være intakte, hvis hele projektmappen kopieres med.

Formattering er ofte noget man først vil lære om, når man støder på problemet - den generelle løsning at holde encoding af scripts og filer man læser fra/skriver til i UTF-8 (som fint arbejder med specialtegn som æøå). Så længe man åbne projektet først og tilgår scripts/notebooks herfra, bevares UTF-8 formatteringen. 

Endelig er projects relativt nemme at sætte op til versioneringsværktøjer som Git. Versionering er dog et kapitel for sig, men for R-brugere kan jeg anbefale https://happygitwithr.com/, hvis man vil i gang med Git og muligvis Github. Fordelen ved versionering er bl.a., at man bedre kan holde orden i sit projekt. Så længe ens scripts er versioneret (og versionerne har nogle fornuftige "commit"-kommentarer), så kan man altid hente tidligere versioner igen. Det betyder, man forhåbentlig kan undgå at have en 01_prepare_rawdata.rmd og 02_prepare_rawdata_version_2.Rmd eller en masse udkommenteret kode i sine scripts, hvis man er bekymret for en ændring man laver er forkert og gerne vil kunne genskabe et tidligere script.

Der er selvfølgelig mange måder man kan vælge at organisere sine projekter på.  Dette er også mere et eksempel snarere end udtryk for nødvendigvis at være den bedste måde, der findes. Forhåbentlig kan det dog give lidt inspiration - særligt til dem, som nogle gange kæmper med at genfinde sine gode analyser :)


Partnervirksomheder

Stort tak til alle virksomheder i ALT ANDET LIGEs partnerprogram. Hør mere om programmet, skriv til partner@altandetlige.dk