9. Duomenų įkėlimas ir išsaugojimas

Šiame skyriuje bus mokoma į programą „R“ įsikelti duomenis bei programoje esančius duomenis išsaugoti į duomenų bylas. Svarbiausiems duomenų formatams skirti atskiri poskyriai, kurie suskirstyti į dalis „išsaugojimas“ (aprašoma, kaip „R“ esančius duomenis išsaugoti kompiuteryje), „nuskaitymas“ (nurodoma, kaip duomenis įsikelti į programą „R“) bei „RStudio įrankiai“ (jei „RStudio“ turi įrankius, palengvinančius darbą su tam tikro tipo duomenimis, jie nagrinėjami šioje dalyje).

Duomenų įkėlimo ir išsaugojimo skyriai techninėje angliškoje literatūroje gali būti trumpinami IO, I/O ar panašiai (nuo žodžių input and output), pvz., „Data IO“.

Duomenis į programą „R“ galima importuoti:

  1. įsikeliant iš „R“ paketų;
  2. nuskaitant iš duomenų bylų (esančių kompiuteryje ar internete);
  3. susivedant „ranka“;
  4. iš iškarpinės (pvz., naudojant kopijavimą, Ctrl+C), jei jie yra pateikti tinkamu formatu.

Apie įvairius (šiame skyriuje aptariamus ir neminimus) duomenų nuskaitymo aspektus galite skaityti vadovėlio „R for Data Science“ skyriuje „Data import“ , vadovėlio „YaRrr! The Pirate’s Guide to R“ skyriuje „Importing, saving and managing data“ bei funkcijų atmintinėje „Data Import“ (pirmas puslapis).

9.1 Svarbiausi duomenų bylų formatai

Priklausomai nuo prigimties, duomenys kompiuteryje, interneto svetainėse ar duomenų bazėse gali būti saugomi daugybe formatų. Šio kurso metu daugiausiai dirbsime su duomenų lentelės tipo duomenimis, todėl susipažinsime, kokiais formatais įprastai išsaugomos duomenų lentelės. Šio kurso kontekste svarbiausi bylų su duomenimis formatai pateikti pav. 9.1.

Bylų su duomenų lentelėmis klasifikavimas.
Šio kurso kontekste svarbiausi bylų su duomenimis formatai: duomenys „R“ paketuose, .Rds, .RData bylos, tekstiniai skirtukais atskirtų reikšmių formatai ir „Excel“ bylos.

Pav. 9.1: Bylų su duomenų lentelėmis klasifikavimas. Šio kurso kontekste svarbiausi bylų su duomenimis formatai: duomenys „R“ paketuose, .Rds, .RData bylos, tekstiniai skirtukais atskirtų reikšmių formatai ir „Excel“ bylos.

Dažnai duomenų bylos tipą galime atpažinti pagal bylos pavadinimo plėtinį, pvz., .txt ar .xlsx.

Skirtingų programų ir formatų bylų pavadinimai įprastai turi standartinius tam formatui bylos pavadinimo plėtinius (taip vadinamos raidės po paskutinio taško, pagal kurias operacinė sistema parenka, kokia programa atidaryti bylą). Tam, kad juos matytumėte, rekomenduoju naudoti „RStudio“ langą „Files“, nes kitais būdais plėtiniai gali būti paslėpti (pav. 9.2). Panagrinėkime kelis šio kurso metu svarbius pavyzdžius – plėtiniai:

  • .txt, .csv, .dat rodo, kad tai tekstiniai duomenys. Gali būti ir kitokių plėtinių arba tekstinė byla gali būti apskritai be plėtinio. Taip pat turėkite omenyje, kad tekstinėse bylose gali būti nebūtinai duomenys arba nebūtinai skirtukais atskirtų formatų duomenys, o .csv nėra „Excel“ formatas, nors ir gali turėti „Excel“ ikoną;
  • .xlsx arba .xls – programos „Excel“ formatai;
  • .Rds, .rds, .RDS – „R duomenų struktūros“ (Rds) formato byla;
  • .RData, .Rda, .rda – R-data formato byla.

Duomenų bylų pavadinimų peržiūra programomis „Windows Explorer“ (kairėje) ir „RStudio“ (dešinėje).
Sistemoje „Windows“ žinomų duomenų tipų plėtiniai buvo paslėpti („Name“), bet rodomi duomenų tipų apibūdinimai („Type“).
Programoje „RStudio“ plėtiniai rodomi visada.
CSV (*comma separated values*) iš tiesų yra tekstinė byla, nors ir matoma „Excel“ ikona  („rankos.csv“).

Pav. 9.2: Duomenų bylų pavadinimų peržiūra programomis „Windows Explorer“ (kairėje) ir „RStudio“ (dešinėje). Sistemoje „Windows“ žinomų duomenų tipų plėtiniai buvo paslėpti („Name“), bet rodomi duomenų tipų apibūdinimai („Type“). Programoje „RStudio“ plėtiniai rodomi visada. CSV (comma separated values) iš tiesų yra tekstinė byla, nors ir matoma „Excel“ ikona („rankos.csv“).

„Tidyverse“ sistemoje programos „R“ ir tekstinių duomenų formatų nuskaitymui skirtas paketas readr , „Excel“ formatams – paketas readxl , kitų statinių programų formatams – paketas haven .

9.1.1 R objektų pavadinimai

Rekomenduoju, kad kurdami „R“ objektų (šiuo atveju, nuskaitytų duomenų) pavadinimus vadovautumėtės „Tidyverse“ stiliaus gido rekomendacijomis objektų pavadinimams (nuoroda ). Ilgainiui pastebėsite, kad naudojant šias taisykles darbas su duomenimis supaprastėja, pvz., nereikia prisiminti, kuri raidė pavadinime yra didžioji, kuri – mažoji. Tema apie „R“ objektų pavadinimus plačiau nagrinėjama skyriuje „4.2.3 [Objektų pavadinimai]“. Santrauka:

  1. Objektų pavadinimus turi sudaryti mažosios angliškos raidės (a–z), skaičiai (0–9) ir apatiniai brūkšniai (_);
  2. Pavadinimas turi prasidėti raide.

9.2 R duomenų formatai

Yra trys pagrindiniai programos „R“ duomenų formatai: duomenys, pateikti „R“ paketuose, formatas .RData bei formatas .Rds (pav. 9.1).

9.2.1 Duomenys iš R paketų

Kuriant „R“ paketus, juose galima išsaugoti duomenis. Kai kurie paketai sukurti vien tik duomenų saugojimui.

Išsaugojimas

Būdai, kaip į paketą įrašyti duomenis įprastai nagrinėjami einant temas apie „R“ paketų kūrimą (pvz., vadovėlyje „R packages“ ). Šiame skyriuje to nenagrinėsime.

Nuskaitymas

Labai naudinga mokėti įsikelti „R“ paketuose esančius duomenis. Įprastai tokie duomenys skirti įvairių analizių ir metodų išbandymui. Šiuo tikslu naudojama funkcija data(), kurios skliaustuose nurodomas duomenų lentelės pavadinimas ir paketo pavadinimas, pvz.:

data(duomenys, package = "paketas")

arba

data("rock", package = "datasets")

Jei paketas yra užkrautas, argumento package galite ir nenaudoti. Visgi dėl aiškumo rekomenduoju nurodyti ir paketą.

Pradžioje duomenys gali būti įkrauti tik iš dalies rezervuojant pavadinimą, bet pačių duomenų į kompiuterio atmintį neįkeliant. Tokiu atveju galite matyti užrašą <Promise> (pav., 9.3). Duomenys galutinai įkeliami tik atlikus kokį nors veiksmą su jais. Tai vienas iš tingiojo užkrovimo (angl. lazy loading) pavyzdžių.


Duomenų iš „R“ paketų užkrovimas.
Šio tipo duomenys užkraunami naudojant komandą `data()`{.r}.
Vos parašius šią komandą, „RStudio“ ima siūlyti galimus duomenų rinkinių pavadinimus, kuriuos galima pasirinkti pele.
Funkcija `data()`{.r} įprastai įvykdo tik pirminį įkėlimą ir rezervuoja pavadinimą „R“ atmintyje, todėl matome užrašą „promise“.
Galutinis įkėlimas į „R“ atmintį įvyksta, kai su duomenimis atliekame kokį nors veiksmą, pavyzdžiui, panaudoję funkciją `dim()`{.r} nustatome duomenų lentelės eilučių ir stulpelių skaičių.

Pav. 9.3: Duomenų iš „R“ paketų užkrovimas. Šio tipo duomenys užkraunami naudojant komandą data(). Vos parašius šią komandą, „RStudio“ ima siūlyti galimus duomenų rinkinių pavadinimus, kuriuos galima pasirinkti pele. Funkcija data() įprastai įvykdo tik pirminį įkėlimą ir rezervuoja pavadinimą „R“ atmintyje, todėl matome užrašą „promise“. Galutinis įkėlimas į „R“ atmintį įvyksta, kai su duomenimis atliekame kokį nors veiksmą, pavyzdžiui, panaudoję funkciją dim() nustatome duomenų lentelės eilučių ir stulpelių skaičių.


Video epizodas 9.1 Programos „R“ paketuose esančių duomenų nuskaitymas.


Dėstydamas ankstesniais metais pastebėjau, kad naudodami šio poskyrio medžiagą studentai bando nuskaityti bet kokius duomenis. Visgi įsiminkite, kad:

Funkcija data() skirta nuskaityti ne bet kokius, o tik mokomuosius duomenis iš „R“ paketų.

9.2.2 .RData formatas

„RData“ yra programos „R“ duomenų formatas, kuriuo galima išsaugoti vieną ar net visus programos „R“ darbinėje erdvėje esančius objektus. Šiuo formatu automatiškai išsaugomi objektai, kai išjungiama programa „R“ (jei toks išsaugojimas nėra išjungtas). Formatu .RData galima išsaugoti tiek duomenų lenteles, tiek kokios klasės objektus. Išsaugojimui ir nuskaitymui naudojamos paketo base funkcijos. Užkraunant objektą, išlieka visos programoje „R“ nustatytos objektų savybės, pvz., kategorinių kintamųjų kategorijų eilės tvarka. Užkraunant duomenis iš .RData formato bylos negalima pakeisti objektų pavadinimų – lieka tokie, kokius išsaugojome.

Jei „R“ atmintyje yra objektas (žiūrėti „RStudio“ lange „Environment“) tokiu pat pavadinimu, kaip ir „.RData“ byloje (įprastai kol neėsikeliame, pažiūrėti negalime), tai atidarius šią bylą senasis objektas iš atminties bus ištrintas ir pakeistas naujuoju, kuris buvo nuskaitytoje byloje. Būkite atidūs, kad neprarastumėte svarbių duomenų.

Būtent dėl šios priežasties iš visų „R“ duomenų formatų .RData rekomenduoju mažiausiai.

Išsaugojimas

Jei norime išsaugoti vieną ar kelis objektus .RData formatu, naudojame funkciją save() ir nurodome jų pavadinimus bei bylos pavadinimą, kurios plėtinys turėtų būti .RData.

save(duomenys_1, duomenys_2, file = "duomenys.RData")

Jei norime išsaugoti visus darbinėje erdvėje esančius objektus, naudojame funkciją save.image() ir nurodome tik bylos pavadinimą, kurios plėtinys turėtų būti .RData.

save.image(file = "duomenys.RData")

Nuskaitymas

Šio formato duomenų nuskaitymui naudojama funkcija load(). Jai nurodomas tik nuskaitomos bylos pavadinimas. Duomenų objektams, esantiems .RData byloje, pavadinimų suteikti negalime.

load(file = "duomenys.RData")

RStudio įrankiai

„RStudio“ įrankiai, skirti .RData formato duomenų nuskaitymui vaizduojami pav. 9.4 ir demonstruojami video epizode 9.2.

Programos „R“ „.Rdata“ formato duomenų nuskaitymas
Bylų plėtinys gali būti *.Rda*, *.RData*, *.Rdata* ar analogiškas.

Pav. 9.4: Programos „R“ „.Rdata“ formato duomenų nuskaitymas Bylų plėtinys gali būti .Rda, .RData, .Rdata ar analogiškas.

Panagrinėkime pav. 9.4. Kortelėje „Files“ \((A_1)\) atsidarome aplanką su duomenimis. Pele spustelime .RData formato bylos pavadinimą \((A_2)\). Atsidaro langas \((B)\), kuriame klausiama, ar tikrai norime įsikelti duomenis, ir kad jei byloje bus objektas tokiu pat pavadinimu, kaip „R“ atmintyje, pastarasis bus prarastas. Jei sutinkame, spaudžiame „Yes“. „R“ konsolėje parašomas duomenų nuskaitymo kodas (demonstruojama video epizode 9.2). Jei reikia, jį galime nusikopijuoti ir įklijuoti į duomenų analizei skirtą bylą.

9.2.3 .Rds formatas

Formatu .Rds galime išsaugoti bet kokį „R“ darbinėje erdvėje esantį objektą. Tačiau tik vieną. Užkraunant išsaugomos visos anksčiau nustatytos objekto savybės, tačiau reikia sukurti naują pavadinimą. Dėl pastarosios priežasties formatas yra saugesnis už .RData.


Šį „R“ duomenų formatą rekomenduoju labiausiai.

Išsaugojimas

Išsaugojimui .Rds formatu galime naudoti readr („Tidyverse“ šeimos paketas) funkciją write_rds(). Išsaugomos bylos plėtinys turi būti .rds arba .Rds.

library(readr)
write_rds(duomenys, path = "byla.rds")

Šiam tikslui skirta ir bazinės sistemos funkcija saveRDS().

Nuskaitymas

.Rds formato nuskaitymui naudojama readr funkcija read_rds().

naujas_pavadinimas <- read_rds(path = "byla.rds")

Arba bazinės sistemos readRDS().

RStudio įrankiai

„RStudio“ turi įrankius, palengvinančius .rds formato duomenų nuskaitymą. Panagrinėkime pav. 9.5 pateiktą medžiagą. Kortelėje „Files“ \((A_1)\) atsidarome aplanką su duomenimis. Pele spustelime .rds formato bylos pavadinimą \((A_2)\). Atsidaro langas \((B)\), kuriame parašome kokiu pavadinimu „R“ vadinsis nuskaitytas objektas \((B_1)\), ir paspaudžiame „OK“ mygtuką \((B_2)\). „R“ konsolėje parašomas duomenų nuskaitymo kodas (demonstruojama video epizode 9.2). Jį nusikopijuojame ir įklijuojame į duomenų analizei skirtą bylą.

Programos „R“ „.Rds“ formato duomenų nuskaitymas naudojant „RStudio“.
Bylų plėtinys gali būti *.Rds*, *.RDS*, *.rds* ar analogiškas.

Pav. 9.5: Programos „R“ „.Rds“ formato duomenų nuskaitymas naudojant „RStudio“. Bylų plėtinys gali būti .Rds, .RDS, .rds ar analogiškas.


Video epizodas 9.2 Programos „R“ formatais .RData bei .Rds išsaugotų duomenų nuskaitymas.


9.3 Excel duomenų formatai

Yra du programos „Excel“ bylų formatai – senesnis .xls ir naujesnis .xlsx. Programa „R“ galima nuskaityti duomenis iš abiejų formatų.

Išsaugojimas

„Tidyverse“ kol kas neturi oficialaus paketo duomenų įrašymui į „Excel“ bylas. Paketai, kurie gali būti naudojami šiuo tikslu: openxlsx, xlsx (paketui reikia „Java“), writexl.

Paprastas pavyzdys naudojant paketą openxlsx.

openxlsx::write.xlsx(duomenys, file = "byla.xlsx")

Sudėtingesnis pavyzdys naudojant paketą openxlsx: parenkamas lapo pavadinimas, kortelės spalva, stulpelių pločiai, o stulpelių pavadinimai pajuodinami.

openxlsx::write.xlsx(
    duomenys, 
    file = "byla.xlsx",
    sheetName = "lapas_3",
    tabColour = "red",
    colWidths = "auto", 
    headerStyle = openxlsx::createStyle(textDecoration = "BOLD"),
    overwrite = FALSE
)

Daugiau pavyzdžių galite rasti paketo vinjetėse („Introduction“ , „Formatting Examples“ ).


Užduotis 9.1 Naudodami duomenų lentelę „iris“ iš paketo datasets išbandykite paketo openxlsx funkcijas duomenims įrašyti. Kuo skiriasi rezultatas naudojant abiejų įrašymo pavyzdžių kodus?

Nuskaitymas

Oficialus „Tidyverse“ paketas Excel byloms nuskaityti yra readxl .

Įprastinė darbo eiga: užsikrauti paketą, pasirinkti bylą su duomenimis ir nustatyti, kuriame bylos lape yra reikalingi duomenys, duomenis iš šio lapo (nurodant arba lapo pavadinimą, arba numerį) nuskaityti. Programiškai tai atrodytų šitaip:

library(readxl)

excel_sheets("byla.xlsx")

duomenys <- read_excel("byla.xlsx", sheet = "lapo_pavadinimas") # arba
duomenys <- read_excel("byla.xlsx", sheet = 1)

Svarbiausi funkcijos read_excel() argumentai:

  • path – (tekstas) bylos pavadinimas (su aplanko pavadinimu);
  • sheet – (tekstas arba sveikasis skaičius) lapo pavadinimas arba numeris;
  • skip – (sveikasis skaičius) mažiausias viršutinių eilučių skaičius, kurį programa praleis prieš nuskaitydama duomenis;
  • n_max (sveikasis skaičius) – didžiausias eilučių skaičius, kurį programa nuskaitys;
  • col_names – (loginė reikšmė arba tekstas) jei TRUE, pirma nuskaityta eilutė laikoma stulpelių pavadinimais; jei FALSE – pavadinimai sukuriami automatiškai; arba nurodomi kiekvieno stulpelio pavadinimai.
  • na – (tekstas) simboliai, kurie bus laikomi praleistomis reikšmėmis.
  • range – (tekstas) Excel langelių sritis, kurią norima nuskaityti, pvz., "B3:D87" arba "Lapas1!B2:G14".

Daugiau skaitykite funkcijos dokumentacijoje ?readxl::read_excel.

Užduotis 9.2

  1. Parsisiųskite „Excel“ bylą „azotas-fosfatas-kalis.xlsx“ ir išsaugokite aktyviajame programos „R“ aplanke.
  2. Nuskaitykite bylos duomenis į „RStudio“.
  3. Koks kintamojo yield reikšmių vidurkis?

RStudio įrankiai

„RStudio“ įrankiai, skirti nuskaityti duomenis iš „Excel“ bylų, vaizduojami video epizoduose 9.3 ir 9.4.


Video epizodas 9.3 „Excel“ formato duomenų nuskaitymas (I). Demonstruojami duomenys .

Užduotis 9.2

  1. Parsisiųskite šią Excel bylą: https://mokymai.github.io/pratybos/duomenys/azotas-fosfatas-kalis.xlsx ir išsaugokite aktyviajame programos „R“ aplanke.
  2. Nuskaitykite bylos duomenis į „RStudio“.
  3. Koks kintamojo yield reikšmių vidurkis?
Video epizodas 9.4 „Excel“ formato duomenų nuskaitymas (II). Demonstruojami duomenys .
Užduotis 9.3 1. Parsisiųskite „Excel“ bylą „Apelsinmedziai.xlsx“ ir išsaugokite aktyviajame programos „R“ aplanke. 2. Nuskaitykite byloje esančią duomenų lentelę į „RStudio“. 3. Nubraižykite medžio kamieno apimties priklausomybės nuo amžiaus grafiką. Ar grafikas panašus į pateiktąjį žemiau (pav. 9.6)?
# Pavyzdys: nubraižome duomenų lentelės „Orange“ 
# stulpelius „age“ ir „circumference“

with(Orange, plot(x = age, y = circumference, col = "blue"))
Pavyzdys, kaip turėtų atrodyti aukščiau pateiktos užduoties atsakymas.

Pav. 9.6: Pavyzdys, kaip turėtų atrodyti aukščiau pateiktos užduoties atsakymas.

9.4 Teksto eilutės

Tekstinėse bylose duomenys gali būti išsaugoti keliomis formomis (pav. 9.1). Tokiose bylose gali būti nestruktūruoti duomenys arba tiesiog tekstas, kurį galima nuskaityti kaip teksto eilutes, arba duomenų lentelės (struktūruoti duomenys), išsaugoti arba skirtukais atskirtų reikšmių, arba fiksuoto pločio stulpelių formatais. Tekstinės bylos įprastai būna pažymėtos plėtiniais .txt, .csv arba .dat. Gali būti ir kitokių arba byla gali apskritai būti be plėtinio, bet šie trys yra dažniausi.

Byla plėtiniu .csv yra tekstinė, o ne „Excel“ formato byla, nors jos ikona gali būti panaši į „Excel“ bylos.

Šiame skyriuje bus aptariama, kaip nuskaityti teksto eilutes.

Išsaugojimas

Teksto eilučių išsaugojimui įprastai naudojama paketo readr funkcija write_lines(). Svarbiausi jos argumentai:

  • x – tai duomenų objektas, kurį įrašome;
  • path – (tekstas) bylos, į kurią įrašome, pavadinimas;
  • append – loginė reikšmė, nurodanti, ar pridėti naujas eilutes, jei byla jau egzistuoja (append = TRUE), ar ištrinti jau esančius duomenis iš bylos ir įrašyti tik naujuosius (append = FALSE).

Daugiau apie funkciją – dokumentacijoje (?readr::write_lines).

write_lines(x = duomenys, path = "tekstas.txt", append = TRUE)

Baziniame „R“ pakete yra analogiškiems tikslams skirta funkcija writeLines(). Kartais gali būti naudinga ir readr::write_file() funkcija.

Nuskaitymas

Teksto eilučių nuskaitymui naudojamos „Tidyverse“ šeimos paketo readr funkcijos:

  • read_lines() – kiekvieną eilutę nuskaito kaip atskirą eilutę, t. y., kaip atskirą „R“ vektoriaus elementą;
  • read_file() – visą bylos turinį nuskaito kaip vieną eilutę.
tekstas <- read_lines(file = "tekstas.txt")
tekstas <- read_file(file = "tekstas.txt")

Svarbiausi teksto eilutes nuskaitančių „Tidyverse“ funkcijų argumentai:

  • file – (tekstas) bylos pavadinimas (su aplanko pavadinimu), internete esančių duomenų adresas arba tiesiog duomenys (tekstas);
  • skip – (sveikasis skaičius) viršutinių eilučių skaičius, kurį programa praleis prieš nuskaitydama duomenis/tekstą;
  • n_max (sveikasis skaičius) – didžiausias eilučių skaičius, kurį programa nuskaitys. Kai n_max = -1, bus nuskaitomos visos eilutės;
  • na – (tekstas) simboliai, kurie bus laikomi praleistomis reikšmėmis.
  • locale – (objektas, sukurtas funkcija locale()) tai nuo kalbos ir vietovės priklausantys nustatymai. Pavyzdžių ieškokite dokumentacijoje;
  • progress – (loginė reikšmė) nurodoma, ar rodyti progreso juostą esant didelei bylai.

9.5 Skirtukais atskirtų reikšmių (SAR) formatas

Tekstinėse bylose duomenų lentelės gali būti išsaugotos keliomis formomis. Šiame skyriuje aptarsime tekstinį skirtukais atskirtų reikšmių (trumpinsime SAR) formatą. Nagrinėjant šio skyriaus medžiagą, gali būti naudinga atmintinė Data Import Cheat Sheet. Esminiai dalykai, kuriuos reikia pastebėti prieš nuskaitant duomenis, išsaugotus šiuo formatu:

  1. Sveikosios ir dešimtosios skaičiaus dalies skirtukas (angl., decimal separator). Juo gali būti arba taškas (., angl. period, jei tai angliškas/amerikietiškas užrašymo variantas), arba kablelis (,, angl. comma, jei tai europietiškas/lietuviškasis variantas);
  2. Stulpelių (reikšmių) skirtukas (angl., field separator, delimiter). Juo gali būti kablelis, kabliataškis (angl., semicolon), tarpas, tabuliacija („ilgas tarpas“), vertikalus brūkšnys (|) ar kitoks simbolis, bet ne taškas (.).

Vienas iš dažniausių tekstinių duomenų formatų – .csv (angl. comma sepatated values). Šios rūšies formatai būna 2 tipų:

  • csv 1 („amerikietiškasis“) formatas, kuriame sveikosios ir dešimtosios skaičiaus dalių skirtukas yra taškas (.), o stulpelių skirtukas yra kablelis (,).
  • csv 2 („europietiškasis“) formatas, kuriame sveikosios ir dešimtosios dalių skirtukas – kablelis (,), o stulpelių skirtukas – kabliataškis (;).

Jei skaičiai į programą „R“ nuskaityti teisingai, tai programoje „R“ tarp sveikosios ir dešimtosios dalies privalo būti taškas, o ne kablelis, pvz., 22.6.

Tekstinių bylų pavyzdžiai pateikti pav. 9.7.

Tekstinėse bylose skirtukais atskirtų reikšmių formatu saugomų duomenų pavyzdžiai.

Pav. 9.7: Tekstinėse bylose skirtukais atskirtų reikšmių formatu saugomų duomenų pavyzdžiai.

Įprastai duomenų stulpelių pavadinimai būna pirmoje eilutėje, o kiekviena kita eilutė yra skirta duomenims. Sakykime, kad tai įprastinis duomenų pateikimo budas. Pvz.:

pavadinimas_1;pavadinimas_2;pavadinimas_3
1,0;A;vyras
6,1;A;moteris
5,2;B;vyras

Tačiau gali būti, kad virš duomenų yra komentarai:

Tai komentaras apie duomenis, o ne patys duomenys

pavadinimas_1;pavadinimas_2;pavadinimas_3
1,0;A;vyras
6,1;A;moteris
5,2;B;vyras

Komentarai gali būti pažymėti kokiu nors simboliu:

# Tai komentaras apie duomenis
pavadinimas_1;pavadinimas_2;pavadinimas_3
1,0;A;vyras
6,1;A;moteris
5,2;B;vyras

Taip pat gali nebūti stulpelių pavadinimų:

1,0;A;vyras
6,1;A;moteris
5,2;B;vyras

Gali būti skirtingu būdu užrašomų praleistų reikšmių. Pvz., praleista reikšmė pažymėta NA:

# NA - praleista reikšmė
pavadinimas_1;pavadinimas_2;pavadinimas_3
NA;A;vyras
6,1;A;NA
5,2;B;vyras

Praleista reikšmė pažymėta ?:

pavadinimas_1;pavadinimas_2;pavadinimas_3
?;A;vyras
6,1;A;?
5,2;B;vyras

Praleistos reikšmės turi skirtingus žymėjimus:

pavadinimas_1;pavadinimas_2;pavadinimas_3
NA;A;vyras
6,1;A;?
5,2;B;vyras

Jei duomenyse yra neangliškų raidžių ar kitokių neįprastų simbolių, gali reikti pasirinkti tinkamą koduotę, tarkime UTF-8. Taip pat dirbant su lietuviškais simboliais turėtų būti nustatyta lietuviškoji lokalė tiek programoje „R“, tiek operacinėje sistemoje (Windows/MAC/Linux), nes kitaip gali kilti nesklandumų.

Tad nuskaitydami duomenis būkite atidūs ir pasirinkite tinkamus nuskaitymo parametrus.

Norintys gilesnių žinių apie CSV bylų sudarymo taisykles gali peržiūrėti šį šaltinį .

9.5.1 Tidyverse sistemos funkcijos SAR duomenų formatams

Išsaugojimas

Duomenų lentelių išsaugojimui naudojamos „Tidyverse“ funkcijos, prasidedančios write_:

  • write_delim() – išsaugojimas skirtukais atskirtų reikšmių formatu. Skirtuką galima pasirinkit, nepasirinkus naudojamas tarpas;
  • write_tsv() – išsaugojimas reikšmes atskiriant tabuliacijomis;
  • write_csv() – išsaugojimas CSV 1 tipo formatu;
  • write_excel_csv() – išsaugojimas CSV 1 tipo formatu, kuriame yra žyma , dėl kurios byla tampa labiau pritaikyta atidaryti programa „Excel“.
write_delim(x = duomenys, path = "byla1.txt")
write_tsv(x = duomenys, path = "byla2.txt")
write_csv(x = duomenys, path = "byla3.csv")
write_excel_csv(x = duomenys, path = "byla4.csv")

Alternatyva „Tidyverse“ funkcijoms – bazinės „R“ funkcijos write.table(), write.csv(), write.csv2() arba paketo data.table funkcija fwrite().

Nuskaitymas

SAR formatų bylų nuskaitymui naudojamos „Tidyverse“ funkcijos, prasidedančios read_.

  • read_delim() – skirta nuskaityti SAR formatų bylas nurodant reikšmių (stulpelių) skirtuką;
  • read_tsv() – tai read_delim() variantas, kai reikšmių skirtumas yra tabuliacija;
  • read_csv() – skirta CSV 1 tipo byloms nuskaityti;
  • read_csv2() – skirta CSV 2 tipo byloms nuskaityti;
  • read_table() – skirta nuskaityti SAR formatų bylas, kai reikšmių skirtukais yra vienas arba keli tarpai. Dokumento eilučių struktūra yra griežta, vizualiai primena lentelę ir galima teigti, kad tai atskiras fiksuoto pločio stulpelių formato variantas (aprašomas skyriuje 9.6): kiekviena eilutė privalo būti vienodo ilgio, o kiekvienas stulpelis – toje pačioje pozicijoje.
  • read_table2() – skirta nuskaityti SAR formatų bylas, kai reikšmių skirtukais yra vienas arba keli tarpai. Eilutės gali būti skirtingo ilgio, o tarp reikšmių esantis tarpų skaičius gali kisti.
duomenys <- read_delim(file = "byla.txt")

duomenys <- read_tsv(file = "byla.txt")

duomenys <- read_csv(file = "byla.txt")
duomenys <- read_csv2(file = "byla.txt")

duomenys <- read_table(file = "byla.txt")
duomenys <- read_table2(file = "byla.txt")

Svarbiausi tekstinius SAR formato duomenis nuskaitančių „Tidyverse“ funkcijų argumentai:

  • file – (tekstas) bylos pavadinimas (su aplanko pavadinimu), internete esančių duomenų adresas arba tiesiog duomenys (tekstas);
  • delim – (tekstas) duomenų reikšmių (stulpelių) skirtumas;
  • locale – (objektas, sukurtas funkcija locale()) tai nuo kalbos ir vietovės priklausantys nustatymai; Pvz., jei sveikosios ir dešimtosios dalies skirtukas yra kablelis, o ne taškas, reikia nurodyti: locale = locale(decimal_mark = ",");
  • skip – (sveikasis skaičius) viršutinių eilučių skaičius, kurį programa praleis prieš nuskaitydama duomenis/tekstą;
  • n_max (sveikasis skaičius) – didžiausias eilučių skaičius, kurį programa nuskaitys;
  • na – (tekstas) simboliai, kurie bus laikomi praleistomis reikšmėmis;
  • col_names – (loginė reikšmė arba tekstas) jei TRUE, pirma nuskaityta eilutė laikoma stulpelių pavadinimais; jei FALSE – pavadinimai sukuriami automatiškai; arba nurodomi kiekvieno stulpelio pavadinimai;
  • comment – (tekstas) komentaro simbolis, po kurio eilutėje esantis tekstas nebus nuskaitomas;
  • progress – (loginė reikšmė) nurodoma, ar rodyti progreso juostą esant didelei bylai.

Kaip alternatyva „Tidyverse“ funkcijoms gali būti naudojamos bazinės „R“ funkcijos read.csv(), read.csv2(), read.table(), read.delim(), read.delim2() arba data.table paketo funkcija fread() (skyrius „9.5.2 Funkcija fread()“).

RStudio įrankiai

„RStudio“ įrankiai, duomenims nuskaityti naudojantys „Tidyverse“ funkcijas, demonstruojami video epizoduose 9.5 ir 9.6. Įrankiai, naudojantys bazinės sistemos funkcijas, demonstruojami pav. 9.9 ir video epizode 9.7.


Video epizodas 9.5 Tekstinėse bylose esančių skirtukais atskirtų reikšmių formatu išsaugotų duomenų nuskaitymas naudojant „RStudio“ langą „Import Dataset“ „From Text (readr)…“
(„Tidyverse“ sistemos funkcijos – pirma dalis). Demonstruojami duomenys .


Užduotis 9.4

  1. „RStudio“ projekte „Pratybos_2_darbui_auditorijoje“, kurį atsisiuntėte darydami 6.11 skyriaus užduotis, yra aplankas „duomenys“. Jame yra 2 .csv bylos. Teisingai nuskaitykite duomenis, esančius abejose bylose.

Norintiems gilesnių žinių apie CSV bylų sudarymo taisykles gali pagelbėti ši nuoroda: https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules


Video epizodas 9.6 Tekstinėse bylose esančių skirtukais atskirtų reikšmių formatu išsaugotų duomenų nuskaitymas naudojant „RStudio“ langą „Import Dataset“ „From Text (readr)…“
(„Tidyverse“ sistemos funkcijos – antra dalis). Demonstruojami duomenys .


Dėmesio: dirbant „RStudio“ ir naudojant „Tidyverse“ duomenų nuskaitymo meniu gali kilti problemų nuskaitant tekstinius duomenis, kai stulpelių skirtukai yra keli tarpai. Problemą išspręsite vietoje komandos read_table() naudodami read_table2().

Užduotis 9.5

  1. Atsidarykite aplanką „duomenys-2“, esantį to paties „RStudio“ projekto „Pratybos_2_darbui_auditorijoje“ aplanke. Teisingai nuskaitykite duomenis, esančius 7-iose bylose, kurių pradžia „01_“, o plėtinys „.txt“.
  2. Atsidarykite aplanką „duomenys“, esantį to paties projekto aplanke.
  3. Teisingai nuskaitykite duomenis, esančius visose tekstinėse bylose, kurių plėtinys „.txt“ arba „.dat“. (Tie patys duomenys pateikti keliais formatais, jei nuskaitėte teisingai – atitinkamų duomenų lentelės turi būti identiškos).

Norėdami nuskaitydami tekstinio formato duomenis galite naudoti ir „RStudio“ įrankį „From Text (base)“ (pav. 9.8, 9.9, video epizodas 9.7). Daugelis nuskaitymo parametrų įprastai teisingai parenkami automatiškai. Tačiau kiekvieną kartą įsitikinkite, ar tikrai stulpeliai turi teisingus pavadinimus (juos vaizduoja pirmoji, pajuodinta, eilutė lange „Data Frame“) ir kiekvienas stulpelis nuskaitomas kaip atskiras stulpelis. Jei duomenyse yra lietuviškų ar kitokių ne angliškų simbolių, gali reikti pasirinkti UTF-8 koduotę.


Duomenų nuskaitymas.
$A_1$, $A_2$, $A_3$ – tekstinių duomenų nuskaitymo meniu atidarymas.
$B$ – norimos tekstinių duomenų bylos pasirinkimas. 
Tam, kad pirma duomenų eilutė būtų nuskaityta kaip pavadinimai, ties užrašu „Heading“ turi būti pasirinkta „Yes“ ($C_1$).
Įsikėlus duomenis, duomenų nuskaitymo programos kodas pasirodo lange „Console“ (pav. \@ref(fig:09-read-data-get-code)).

Pav. 9.8: Duomenų nuskaitymas. \(A_1\), \(A_2\), \(A_3\) – tekstinių duomenų nuskaitymo meniu atidarymas. \(B\) – norimos tekstinių duomenų bylos pasirinkimas. Tam, kad pirma duomenų eilutė būtų nuskaityta kaip pavadinimai, ties užrašu „Heading“ turi būti pasirinkta „Yes“ (\(C_1\)). Įsikėlus duomenis, duomenų nuskaitymo programos kodas pasirodo lange „Console“ (pav. 9.10).


Video epizodas 9.7 Tekstinėse bylose esančių skirtukais atskirtų reikšmių formatu išsaugotų duomenų nuskaitymas naudojant „RStudio“ langą „Import Dataset“ „From Text (base)…“
(Bazinės „R“ sistemos funkcijos).


Skirtukais atskirtų duomenų nuskaitymas iš tekstinių bylų naudojant „RStudio“ langą „Import Dataset“ „From Text (base)...“

Pav. 9.9: Skirtukais atskirtų duomenų nuskaitymas iš tekstinių bylų naudojant „RStudio“ langą „Import Dataset“ „From Text (base)…“

Paveiksle 9.9 rodoma, kaip nuskaityti duomenis naudojant „RStudio“. Šios programos lange „Environment“ \((A_1)\) spaudžiame mygtuką „Import Dataset“ \((A_2)\), po to „From Text (base)“ \((A_3)\). Tai bazinis (ne tidyverse), labai automatizuotas statistinei analizei tinkamas tekstinių duomenų nuskaitymo būdas. Ko gero, labiausiai suprantamas pradedantiesiems. Atsidariusiame lange susirandame aplanką su duomenimis ir pasirenkame tekstinių duomenų bylą \((B)\). Atsidaro nuskaitymo meniu, kuriame matome pirmąsias duomenų bylos eilutes \((C_1)\), pagal jas programa automatiškai parenka nuskaitymo parametrus ir juos įrašo parametrų pasirinkimo langeliuose \((C_2)\). Dažniausiai koreguoti nereikia. Jei reikia – pakoreguojame. Apatiniame lange \((C_3)\) galime pasitikrinti, ar duomenys bus nuskaityti teisingai: stulpelių pavadinimai pajuodinti, o patys duomenys – atskiruose stulpeliuose, aiškiai atskirtuose tarpais. Belieka parašyti duomenų lentelės pavadinimą \((C_4)\), kuriame gali būti tik angliškos raidės, apatiniai brūkšniai ir skaičiai, pirmasis simbolis – raidė. Kitų simbolių, pvz., tarpų, taškų, naudoti nerekomenduoju. Uždedame varnelę ties užrašu „Strings as Factors“ \((C_5)\): tekstiniai kintamieji („strings“) bus paverčiami į faktorius („factors“) – statistinei analizei tinkamą kategorinių kintamųjų tipą. Galiausiai spaudžiame „Import“ \((C_6)\). „RStudio“ konsolėje atspausdinamas duomenų nuskaitymui naudojamas programos kodas. Norėdami jį nusikopijuoti, galite žymeklį padėti lange „Console“ ir klaviatūroje paspausti rodyklę į viršų . Atsiras nuskaitymo kodas be papildomų nereikalingų simbolių, kurį patogu kopijuoti.

Tais atvejais, kai reikalingas duomenų nuskaitymo kodas, jį galite nusikopijuoti pav. 9.10 parodytu būdu.


Duomenų nuskaitymo kodo kopijavimas.
Lange „Console“ (1) atsiranda programos kodas (2), sugeneruotas duomenų nuskaitymo langu (\@ref(fig:09-read-data-correct-heading)).
Jei kodo nesimato, padidinkite langą (3).
Jei po duomenų įkėlimo vykdėte dar ir kitas komandas, padėkite pelės žymeklį „Console“ lange ir spauskite klavišą <kbd>↑</kbd> (rodyklė į viršų) vieną ar kelis kartus, kol pamatysite reikiamą kodą.
Tada jį pasižymėkite, kaip rodoma (5), ir nusikopijuokite.
Pastebėkite, kad eilutės pradžioje esančio „**`>`**“ simbolio kopijuoti nereikia.
Tada kodą įsiklijuokite reikiamoje vietoje (6).
Kai dirbate „RStudio“ projekte, tai nuskaitomos bylos pavadinimą galite sutrumpinti (7) panaikindami projekto aplanko pavadinimą (8), kuris, jei nepakeitėte aktyviojo aplanko, matomas viršutinėje „Console“ lango dalyje (9).

Pav. 9.10: Duomenų nuskaitymo kodo kopijavimas. Lange „Console“ (1) atsiranda programos kodas (2), sugeneruotas duomenų nuskaitymo langu (9.8). Jei kodo nesimato, padidinkite langą (3). Jei po duomenų įkėlimo vykdėte dar ir kitas komandas, padėkite pelės žymeklį „Console“ lange ir spauskite klavišą (rodyklė į viršų) vieną ar kelis kartus, kol pamatysite reikiamą kodą. Tada jį pasižymėkite, kaip rodoma (5), ir nusikopijuokite. Pastebėkite, kad eilutės pradžioje esančio „>“ simbolio kopijuoti nereikia. Tada kodą įsiklijuokite reikiamoje vietoje (6). Kai dirbate „RStudio“ projekte, tai nuskaitomos bylos pavadinimą galite sutrumpinti (7) panaikindami projekto aplanko pavadinimą (8), kuris, jei nepakeitėte aktyviojo aplanko, matomas viršutinėje „Console“ lango dalyje (9).

9.5.2 Funkcija fread()

Funkcija fread() yra paketo data.table dalis. Ji skirta labai greitam duomenų, išsaugotų tekstiniu skirtukais atskirtų reikšmių formatu, nuskaitymui. Funkcijos privalumas tas, kad ji dažniausiai automatiškai atpažįsta daugelį standartinių parametrų (pvz., koks stulpelių skirtukus, ar lentelės stulpeliai turi pavadinimus, kiek pirmųjų eilučių reikia praleisti, ar stulpeliai turi pavadinimus) ir teisingai nuskaito duomenis. Funkcija yra labai greita, nes jos branduolys parašytas programavimo kalba C++. Kiti funkcijos privalumui aprašomi straipsnyje „Convenience features of fread“ , naudojimas – dokumentacijoje (?data.table::fread).

Svarbiausi funkcijos argumentai

Svarbiausi funkcijos fread() argumentai:

  1. input (tekstas) – duomenų bylos pavadinimas arba patys duomenys (pavyzdys skyriuje „Pavyzdžiai: fread()“):
    • tekstinių duomenų bylos, esančios jūsų kompiuteryje, pavadinimas (įskaitant aplanko pavadinimą, jei byla ne aktyviajame aplanke);
    • tekstinių duomenų bylos, esančios internete, adresas ir pavadinimas;
    • duomenys: tekstas, kuriame daugiau nei viena eilutė, traktuojamas kaip duomenų lentelė;
    • shell komandos – apie jas nesimokysime.
  2. sep (tekstas) – stulpelių (reikšmių) skirtukas. Vienas simbolis. Šį skirtuką funkcija fread() įprastai atpažįsta ir parenka automatiškai. Jei skirtukas yra nestandartinis arba funkcija jį parenka neteisingai, reikia nurodyti rankiniu būdu. Įprastai būna tarpas (" "), kablelis (","), kabliataškis (";"), tabuliacija (žymima "\t") arba vertikalus brūkšnys ("|").
  3. dec (tekstas) – sveikosios ir dešimtosios skaičiaus dalies skirtukas. Pagal nutylėjimą – tai taškas (dec = "."). Jei sveikoji ir dešimtoji dalys atskirtos kableliu, kaip būna europietiško tipo formatuose, tada tai (dec = ",") reikia nurodyti rankiniu būdu.
  4. encoding (tekstas) – koduotė. Galimos reikšmės: "unknown", "UTF-8" arba "Latin-1". Jei siekiama nuskaityti duomenis, kuriuose yra lietuviškų simbolių, įprastai reikalinga UTF-8 koduotė.
  5. skip (skaičius arba tekstas) – sveikasis skaičius, nurodantis, kiek eilučių bylos pradžioje turi būti praleista. Tose eilutėse įprastai yra ne duomenų lentelė, o papildoma informacija, komentarai. Jei konkreti reikšmė nenurodyta, šias eilutes funkcija fread() įprastai atpažįsta ir praleidžia automatiškai. Kitos galimos parinktys aprašytos funkcijos dokumentacijoje.
  6. nrows (skaičius) – sveikasis skaičius, nurodantis, kiek daugiausiai eilučių nuskaityti. Nurodžius nrows = 0, nuskaitomi tik stulpelių pavadinimai ir sukuriama tuščia lentelė. Nurodžius nrows = Inf, nuskaitomos visos eilutės.
  7. header – loginė reikšmė, kuria nurodoma, ar duomenų lentelėje pateikti stulpelių pavadinimai. Jei FALSE, stulpeliams pavadinimai sukuriami naudojant stulpelių numerius. Šį nustatymą funkcija fread() įprastai parenka automatiškai.
  8. col.names (tekstas) – jei reikia, ženklų eilučių vektorius su stulpelių pavadinimais.
  9. na.strings (tekstas) – ženklų eilučių vektorius su reikšmėmis, kurias reikia interpretuoti kaip praleistas reikšmes.
  10. quote (tekstas) – kokios rūšies kabutės naudojamos į vieną stulpelį sujungti tarpais atskirtus žodžius (viengubos ' ar dvigubos "). Pagal nutylėjimą žodžiai tarp dvigubų kabučių (") interpretuojami kaip to paties stulpelio reikšmės. Jei norime pakeisti į viengubas kabutes, galime pasirinkti argumentą quote = "'".
  11. stringsAsFactors – loginė reikšmė, nurodanti, ar tekstinius kintamuosius (t. y., ženklų eilutes) interpretuoti kaip kategorinius kintamuosius? Galimo pasirinkimo variantai:
    • FALSE (pasirenkama pagal nutylėjimą) – interpretuoti kaip tekstinius kintamuosius (angl. character, sutrumpintai chr);
    • TRUE – paverčiama į kategorinius kintamuosius (angl. factor).

Jei jūsų kompiuteryje yra įdiegtas paketas data.table, daugiau apie funkciją fread() ir jos parametrus galite sužinoti į „R“ komandų langą suvedę:

?data.table::fread

Pavyzdžiai: fread()

Keliuose tolimesniuose pavyzdžiuose bus naudojami duomenys (arba jų fragmentai), viešai prieinami internetu . Duomenų aprašymą galite rasti čia .

Užkraukime paketą:

library(data.table)

Pirmame pavyzdyje duomenys nuskaityti iš bylos, esančios mano kompiuteryje. Byloje stulpeliai neturi pavadinimų, pirmosios 3 eilutės – papildoma informacija (kaip matome, ji nenuskaitoma). Jūs šiuos duomenis galite atsisiųsti . Atspausdinu pirmąsias tekstinės bylos eilutes:

Source: http://calcnet.mth.cmich.edu/org/spss/V16_materials/DataSets_v16/Diseaseoutbreak.dat
Description: http://calcnet.mth.cmich.edu/org/spss/Prj_diseaseData.htm

1     33      1      1      0      1
2     35      1      1      0      1
3      6      1      1      0      0
4     60      1      1      0      1
5     18      3      1      1      0
6     26      3      1      0      0
7      6      3      1      0      0
8     31      2      1      1      1
# Nuskaitome duomenis kaip tekstą (eilutė po eilutės)
tekstas <- readLines("duomenys/Diseaseoutbreak.txt")  

# Atspausdiname 10 pirmų eilučių
writeLines(tekstas[1:10])
## Source: http://calcnet.mth.cmich.edu/org/spss/V16_materials/DataSets_v16/Diseaseoutbreak.dat
## Description: http://calcnet.mth.cmich.edu/org/spss/Prj_diseaseData.htm
## 
## 1     33      1      1      0      1
## 2     35      1      1      0      1
## 3      6      1      1      0      0
## 4     60      1      1      0      1
## 5     18      3      1      1      0
## 6     26      3      1      0      0
## 7      6      3      1      0      0

Duomenų nuskaitymas:

# Duomenys nuskaityti iš bylos, esančios kompiuteryje.
is_bylos <- fread("duomenys/Diseaseoutbreak.txt", skip = 3)
head(is_bylos)
##    V1 V2 V3 V4 V5 V6
## 1:  1 33  1  1  0  1
## 2:  2 35  1  1  0  1
## 3:  3  6  1  1  0  0
## 4:  4 60  1  1  0  1
## 5:  5 18  3  1  1  0
## 6:  6 26  3  1  0  0

Antrame pavyzdyje duomenys nuskaityti iš bylos, esančios internete. Byloje stulpeliai neturi pavadinimų, tačiau praleistų eilučių bylos pradžioje nėra.

# Duomenys nuskaityti iš bylos, esančios internete.
is_interneto <- fread("http://calcnet.mth.cmich.edu/org/spss/V16_materials/DataSets_v16/Diseaseoutbreak.txt")
head(is_interneto)
##    V1 V2 V3 V4 V5 V6
## 1:  1 33  1  1  0  1
## 2:  2 35  1  1  0  1
## 3:  3  6  1  1  0  0
## 4:  4 60  1  1  0  1
## 5:  5 18  3  1  1  0
## 6:  6 26  3  1  0  0

Trečiame pavyzdyje nukopijuotos 9 šių duomenų eilutės, ir parašytos kaip tekstas (kabutėse). Duomenų stulpeliams suteikiau pavadinimus. Jokių kitų parametrų pateikti nereikėjo, o duomenys vis tiek buvo nuskaityti teisingai.

# Duomenys pateikti kaip tekstas, stulpeliai turi pavadinimus
is_teksto <- fread("
Subject  Age     Class  Sector  Disease   Account
1        33      1      1       0         1
2        35      1      1       0         1
3         6      1      1       0         0
4        60      1      1       0         1
5        18      3      1       1         0
6        26      3      1       0         0
7         6      3      1       0         0
8        31      2      1       1         1
9        26      2      1       1         0
")
head(is_teksto)
##    Subject Age Class Sector Disease Account
## 1:       1  33     1      1       0       1
## 2:       2  35     1      1       0       1
## 3:       3   6     1      1       0       0
## 4:       4  60     1      1       0       1
## 5:       5  18     3      1       1       0
## 6:       6  26     3      1       0       0

9.6 Fiksuoto pločio stulpelių (FWF) formatas

Tekstinis fiksuoto pločio stulpelių formatas yra toks, kai kiekvieno stulpelio duomenims įrašyti skiriamas tam tikras ženklų skaičius (plotis). Tarp stulpelių tarpų gali ir nebūti. Angliškai vadinama fixed width format, tad trumpinama FWF. Šiuo formatu saugomų duomenų pavyzdžiai pateikti žemiau.


FWF duomenų pavyzdys 1.

Atkreipkite dėmesį į reikšmę Jennifer Love, kuri būtų neteisingai nuskaityta, jei naudotume skirtukais atskirtų reikšmių formatą.

Account LastName        FirstName       Balance     CreditLimit   AccountCreated  Rating 
101     Reeves          Keanu           9315.45     10000.00      1/17/1998       A      
312     Butler          Gerard          90.00       1000.00       8/6/2003        B      
868     Hewitt          Jennifer Love   0           17000.00      5/25/1985       B      
761     Pinkett-Smith   Jada            49654.87    100000.00     12/5/2006       A      
317     Murray          Bill            789.65      5000.00       2/5/2007        C      

Įprastai šio formato duomenys stulpelių pavadinimų neturi. Pavyzdyje jie pateikti tik dėl vaizdumo.

Duomenų šaltinis .


FWF duomenų pavyzdys 2.

Sakykime, kad pavyzdyje yra 3 stulpeliai greta vienas kito (be tarpų), kurių plotis po 2 simbolius.

123456
987654
654987
963852
123123
333323
963854

Nuskaitymas

Nuskaitymui naudosime paketo readr funkciją read_fwf(). Sakykime, kad turime duomenis, išsaugotus, kaip objektą txt:

txt <- 
("101     Reeves          Keanu           9315.45     10000.00      1/17/1998       A      
312     Butler          Gerard          90.00       1000.00       8/6/2003        B      
868     Hewitt          Jennifer Love   0           17000.00      5/25/1985       B      
761     Pinkett-Smith   Jada            49654.87    100000.00     12/5/2006       A      
317     Murray          Bill            789.65      5000.00       2/5/2007        C      ")

Toliau reikia nurodyti ir kiekvieno stulpelio plotį ir pavadinimą. Tam „Tidyverse“ sistemoje naudojamos pagalbinės funkcijos, tokios kaip fwf_widths(), fwf_cols(), fwf_positions(), fwf_empty(), apie kurias plačiau rašome dokumentacijoje.

Panagrinėkime, kaip reiktų naudoti fwf_widths(). Pirmiausia susikuriame stulpelio ilgių ir pavadinimų vektorius, iš kurių sudarome stulpelių aprašymą (specifikaciją):

col_widths = c(8, 16, 16, 12, 14, 16, 7)
col_names = c("account", "last_name", "first_name", "balance", "credit_limit", 
              "account_created", "rating")

col_spec_a <- fwf_widths(col_widths, col_names)

Tada nuskaitome duomenis:

duomenys_fwf_1a <- read_fwf(txt, col_spec_a)

Duomenis atspausdiname. „R“ kai kuriuos stulpelius atspausdina glaudžiau, ilgas reikšmes pažymi ~. Tai daroma tik dėl to, kad lentelė būtų atspausdinama kompaktiškai, tačiau atmintyje yra tokios reikšmės, kokios turi būti (t. y., pilni pavadinimai).

duomenys_fwf_1a
## # A tibble: 5 x 7
##   account last_name     first_name   balance credit_limit account_created rating
##     <dbl> <chr>         <chr>          <dbl>        <dbl> <chr>           <chr> 
## 1     101 Reeves        Keanu          9315.        10000 1/17/1998       A     
## 2     312 Butler        Gerard           90          1000 8/6/2003        B     
## 3     868 Hewitt        Jennifer Lo~      0         17000 5/25/1985       B     
## 4     761 Pinkett-Smith Jada          49655.       100000 12/5/2006       A     
## 5     317 Murray        Bill            790.         5000 2/5/2007        C

Šiuo atveju funkcija fwf_cols() būtų netgi patogesnė, nes šalia pavadinimo iš karto nurodomas stulpelio plotis:

col_spec_b <- fwf_cols(account = 8,
                       last_name = 16,
                       first_name = 16, 
                       balance = 12,
                       credit_limit = 14,
                       account_created = 16,
                       rating = 7)

Nuskaitymas vykdomas analogiškai:

duomenys_fwf_1b <- read_fwf(txt, col_spec_b)
duomenys_fwf_1b
## # A tibble: 5 x 7
##   account last_name     first_name   balance credit_limit account_created rating
##     <dbl> <chr>         <chr>          <dbl>        <dbl> <chr>           <chr> 
## 1     101 Reeves        Keanu          9315.        10000 1/17/1998       A     
## 2     312 Butler        Gerard           90          1000 8/6/2003        B     
## 3     868 Hewitt        Jennifer Lo~      0         17000 5/25/1985       B     
## 4     761 Pinkett-Smith Jada          49655.       100000 12/5/2006       A     
## 5     317 Murray        Bill            790.         5000 2/5/2007        C


Pažiūrėkime, kaip galima nuskaityti antro FWF pavyzdžio duomenis ir kodėl svarbu iš anksto žinoti, kokio pločio yra duomenų stulpeliai.

txt_2 <- 
("123456
987654
654987
963852
123123
333323
963854")
duomenys_fwf_2a <- read_fwf(txt_2, fwf_cols(a = 2, b = 2, c = 2))
duomenys_fwf_2a
## # A tibble: 7 x 3
##       a     b     c
##   <dbl> <dbl> <dbl>
## 1    12    34    56
## 2    98    76    54
## 3    65    49    87
## 4    96    38    52
## 5    12    31    23
## 6    33    33    23
## 7    96    38    54


duomenys_fwf_2b <- read_fwf(txt_2, fwf_cols(a = 2, b = 1, c = 3))
duomenys_fwf_2b
## # A tibble: 7 x 3
##       a     b     c
##   <dbl> <dbl> <dbl>
## 1    12     3   456
## 2    98     7   654
## 3    65     4   987
## 4    96     3   852
## 5    12     3   123
## 6    33     3   323
## 7    96     3   854


duomenys_fwf_2c <- read_fwf(txt_2, fwf_cols(a = 1, b = 1, c = 1, d = 1, e = 1, f = 1))
duomenys_fwf_2c 
## # A tibble: 7 x 6
##       a     b     c     d     e     f
##   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1     1     2     3     4     5     6
## 2     9     8     7     6     5     4
## 3     6     5     4     9     8     7
## 4     9     6     3     8     5     2
## 5     1     2     3     1     2     3
## 6     3     3     3     3     2     3
## 7     9     6     3     8     5     4

Pirmasis read_fwf() argumentas gali būti tiek objektas su tekstu, tiek tekstinės bylos pavadinimas kompiuteryje, tiek tekstinės bylos internetinis adresas. Apie kitus argumentus rašoma dokumentacijoje.

Kaip alternatyva gali būti naudojama bazinės „R“ sistemos funkcija read.fwf().


Užduotis 9.6 Kas atsitiks, jei nuskaitydami antro pavyzdžio duomenis nurodysime tik du stulpelius, kurių pločiai lygūs 1 ir 2?

9.7 Kitų programų duomenų formatai

Kitų, šiame skyriuje nenurodytų duomenų formatų nuskaitymui yra sukurta daugybė „R“ paketų. Įvairių statistinių programų formatams nuskaityti gali būti naudojamos paketų haven („Tidyverse“ paketas) bei foreign (bazinis) funkcijos. Jei norite nuskaityti tam tikro specifinio formato duomenis, tinkamiausių funkcijų rekomenduoju ieškoti internetinės paieškos svetainėse, tarkim www.google.com, nurodant programos „R“ pavadinimą, duomenų formatą, pvz., „How to read MATLAB data into R“.

RStudio įrankiai

Šiame skyriuje paaiškinama, kaip nuskaityti populiarių statistinių programų – „SPSS“, „SAS“, „Stata“ – formatais įrašytus duomenis naudojantis „RStudio“ įrankiais.


Video epizodas 9.8 Programų „SPSS“, „SAS“ ir „Stata“ formatais išsaugotų duomenų nuskaitymas. Demonstruojami duomenys .


9.8 Duomenų suvedimas: naujos duomenų lentelės kūrimas

Jei turite nedidelę duomenų lentelę, kurią norite suvesti naudodamiesi klaviatūra, arba tokią, kurią galima nukopijuoti pažymėjus pele, pvz., iš internetinės svetainės, yra keletas galimybių tai atlikti programa „R“.

9.8.1 Funkcijos edit() ir fix()

Funkcijos edit() ir fix() atidaro duomenų įvedimo bei koregavimo lentelę. Šioms funkcijoms turi būti nurodyta egzistuojanti arba sukuriama nauja lentelė kaip daroma šiame pavyzdyje:

duomenys <- edit(data.frame())

SVARBU: jei neatliksite priskyrimo (pvz., duomenys <-), duomenys nebus išsaugoti „R“ atmintyje.


Analogišką veiksmą atlieka ir šis kodas:

duomenys_a <- data.frame()
duomenys_b <- fix(duomenys_a)

9.8.2 Funkcija Rcmdr::editDataset()

Panaši lentelė atidaroma naudojant paketo Rcmdr funkcijas. Pirmiausia turi būti užkraunamas papildinys „R Commander“, kuris iš esmės yra dar vienas programos „R“ (bet ne „RStudio“) langas. Tada naudojant editDataset() atidaroma duomenų įvedimo ir koregavimo lentelė.

library(Rcmdr)
nauji_duomenys <- editDataset()
nauji_duomenys

9.8.3 Funkcijos data.frame() ir tibble()

Alternatyvus būdas – suvesti duomenis kaip „R“ kodą. Tam gali būti naudojamos funkcijos data.frame() ar tibble::tibble() (atkreipkite dėmesį, kad funkcijos pavadinime nėra raidės r), kurioms kiekvienas stulpelis pateikiamas kaip vektorius.

duomenys_df <- data.frame(
    col_a = c("a", "b", "c"),
    col_b = c(1, 2, 3)
)
duomenys_df
##   col_a col_b
## 1     a     1
## 2     b     2
## 3     c     3
duomenys_tbl <- tibble::tibble(
    col_a = c("a", "b", "c"),
    col_b = c(1, 2, 3)
)
duomenys_tbl
## # A tibble: 3 x 2
##   col_a col_b
##   <chr> <dbl>
## 1 a         1
## 2 b         2
## 3 c         3

9.8.4 Funkcija tibble::tribble()

Naudojant paketo tibble funkciją tribble() (atkreipkite dėmesį, kad funkcijos pavadinime yra raidė r, reiškianti row-wise – eilučių kryptimi), stulpelių pavadinimai nurodomi parašant operatorių ~ ir kiekviena įvedama reikšmė atskiriama kableliu, kaip šiame pavyzdyje:

duomenys_tribble <- tibble::tribble(
    ~col_a, ~col_b,
    "a",   1,
    "b",   2,
    "c",   3
)
duomenys_tribble
## # A tibble: 3 x 2
##   col_a col_b
##   <chr> <dbl>
## 1 a         1
## 2 b         2
## 3 c         3

9.8.5 Tekstinių duomenų nuskaitymo funkcijos

Dar viena alternatyva, ypač tinkanti, jei duomenys yra kopijuojami pažymėjus pele, naudoti tekstiniams duomenims nuskaityti skirtas funkcijas, tokias kaip read_table(), read_csv() arba fread(), aprašytas skyriuje „9.5 Skirtukais atskirtų reikšmių (SAR) formatas“. Šiuo atveju duomenys suvedami kaip tekstas, parašytas kabutėse. Pavyzdyje duomenys pateikti CSV formatu:

duomenys_dt <- data.table::fread(
"col_a,col_b,col_c
a,1,0.22
b,2,0.25
c,3,0.14")
duomenys_dt
##    col_a col_b col_c
## 1:     a     1  0.22
## 2:     b     2  0.25
## 3:     c     3  0.14

Duomenų nuskaitymo funkcija ir jos parametrai turi tikti suvedamų duomenų formatui, visai kaip duomenų, nuskaitomų iš tekstinių bylų, atveju.


Proceso eiga turėtų būti daugmaž tokia:

  1. Nusikopijuojame duomenis;
  2. Programoje „R“ užrašome funkcijos pavadinimą bei sukuriamo objekto pavadinimą, pvz.:
duomenys_dt <- data.table::fread()
  1. Įdedame kabučių ženklą iš naujos eilutės prie kairiojo krašto. Kabutės gali būti viengubos arba dvigubos priklausomai nuo duomenų turinio:
duomenys_dt <- data.table::fread(
""
)
  1. Tarp kabučių įklijuojame duomenis, jei reikia, pakoreguojame formatavimą. Atkreipkite dėmesį, kad visas įklijuotas tekstas turi būti nuspalvintas viena tekstui būdinga spalva.
duomenys_dt <- data.table::fread(
"col_a,col_b,col_c
a,1,0.22
b,2,0.25
c,3,0.14")
  1. Įvykdykite komandą ir duomenis nuskaitykite.

Užduotis 9.7

  1. Paveiksle 9.11 pateikta lentelė. Suveskite ją naudodami programos „R“ galimybes, atvaizduokite duomenis sklaidos diagrama. Galiausiai lentelę išsaugokite programos „Excel“ formatu. Parinkite „R“ kintamiesiems tinkamus stulpelių pavadinimus.

Temperatūra pagal Farenheitą ir pagal Celsijų.

Pav. 9.11: Temperatūra pagal Farenheitą ir pagal Celsijų.

Klausimai ir komentarai