Začínáme s čištěním dat v RStudio
Zlaté pravidlo: Nikdy nepřepisujte ani ručně neupravujte původní nezpracovaná data. Každé rozhodnutí týkající se čištění dat zaznamenejte do skriptu v jazyce R a vždy vytvořte samostatný soubor se zpracovanými daty, který lze v případě potřeby kdykoli znovu vygenerovat.
Proč je čištění dat důležité
Výzkumná data jsou jen málokdy připravena k analýze bez dalších úprav. Soubory mohou obsahovat nekonzistentní názvy proměnných, různé formáty data, chybějící hodnoty, duplicitní záznamy, neočekávané kategorie, skryté mezery, nesprávné datové typy nebo hodnoty, které nejsou fyzikálně možné. Tyto problémy mohou způsobovat chyby ve statistických modelech, dále komplikovat slučování datových souborů a ztěžovat ostatním výzkumníkům pochopení nebo opětovné využití výzkumných dat.
Čištění dat proto není pouze přípravným krokem. Je součástí zajištění kvality výzkumu. Dobře naplánovaný postup čištění dat zajišťuje, že transformace nezpracovaných dat na zpracovaná data probíhá transparentně, kontrolovatelně a reprodukovatelně. Zároveň podporuje principy FAIR tím, že zlepšuje dohledatelnost, dostupnost, interoperabilitu a opětovnou využitelnost výzkumných dat.
Než otevřete R: uspořádejte si projekt
Přehledná struktura projektu pomáhá předcházet nechtěnému přepsání souborů a usnadňuje spolupracovníkům, recenzentům i vám samotným v budoucnu orientaci v analýze. Uchovávejte nezpracovaná data, zpracovaná data, skripty, dokumentaci a výstupy v samostatných složkách.
project_name/ ├── README.md ├── data_raw/ # původní soubory; nikdy je neupravujte ├── data_processed/ # vyčištěné soubory vytvořené pomocí skriptů ├── scripts/ # kód pro import, čištění, analýzu a tvorbu grafů ├── docs/ # datový slovník, protokoly a metadata └── outputs/ # tabulky, obrázky a zprávy
Pojmenovávání: Používejte popisné názvy souborů, vyhněte se mezerám a speciálním znakům a v případě, že je součástí názvu souboru datum, používejte formát YYYYMMDD. Například: floodplain_tree_growth_20260727_v01.csv.
Zálohování: Dodržujte princip 3-2-1: uchovávejte tři kopie dat alespoň na dvou různých typech úložišť, přičemž jedna kopie by měla být uložena mimo pracoviště nebo ve schváleném institucionálním systému.
Návod na RStudio krok za krokem:
R je bezplatný programovací jazyk a softwarové prostředí určené pro statistické výpočty, analýzu dat a tvorbu grafů. RStudio (vyvíjené společností Posit) je integrované vývojové prostředí (IDE), které usnadňuje práci s R tím, že v jednom rozhraní nabízí editor skriptů, konzoli, přehled pracovního prostředí, správce souborů, správce balíčků a okno pro zobrazování grafů. Před instalací RStudio je nutné nejprve nainstalovat R.
Odkazy ke stažení:
R (CRAN)
RStudio Desktop
Pořadí instalace:
- Stáhněte a nainstalujte R z CRAN.
- Stáhněte a nainstalujte RStudio Desktop od společnosti Posit.
- Spusťte RStudio. Program automaticky rozpozná nainstalované R a poskytne kompletní vývojové prostředí pro psaní a spouštění kódu v R.
Balíčky nainstalujte pouze jednou
install.packages(c( "tidyverse", "readxl", "janitor", "lubridate", "stringr", "skimr" ))
Balíčky načtěte při každém novém spuštění R
library(tidyverse) # import, transformace a vizualizace dat library(readxl) # načítání sešitů Excelu library(janitor) # standardizace názvů a kontrola tabulek library(lubridate) # načítání a práce s daty library(stringr) # čištění a standardizace textu library(skimr) # stručné souhrny kvality dat
Pamatujte: install.packages() stáhne balíček do vašeho počítače a obvykle jej stačí spustit pouze jednou. library() zpřístupní balíček v aktuální relaci R a po každém restartování R je nutné ji spustit znovu.
Importujte soubor do nového objektu v R. Použijte například název raw_df, aby bylo zřejmé, že objekt představuje původní importovaná data. Nepoužívejte formátování tabulky, barvy, sloučené buňky ani prázdné řádky k uchovávání informací, protože R je nedokáže spolehlivě interpretovat.
raw_df <- read_csv("data_raw/survey_data.csv")
raw_excel <- read_excel(
"data_raw/field_measurements.xlsx",
sheet = "data"
)
raw_txt <- read_delim(
"data_raw/logger_output.txt",
delim = "\t"
)
Pokud se desetinné oddělovače, kódy pro chybějící hodnoty, kódování znaků nebo oddělovače polí liší od výchozího nastavení, zadejte je při importu explicitně. Je to bezpečnější než později opravovat nesprávně importovanou tabulku.
raw_df <- read_csv(
"data_raw/survey_data.csv",
na = c("", "NA", "N/A", "-999"),
locale = locale(decimal_mark = ".")
)
#For example use a dataset included with R raw_df <- airquality head(raw_df)
Kontrola dat vám ukáže, co R skutečně importovalo. Nikdy automaticky nepředpokládejte, že sloupec obsahující čísla byl načten jako číselný datový typ nebo že data byla správně interpretována jako datum. Zkontrolujte jak strukturu dat, tak samotné hodnoty.
head(raw_df) # první řádky tail(raw_df) # poslední řádky View(raw_df) # zobrazení dat ve formě tabulky glimpse(raw_df) # proměnné, datové typy a příklady hodnot str(raw_df) # podrobná struktura objektu summary(raw_df) # základní souhrny číselných a kategoriálních dat skim(raw_df) # širší přehled o kvalitě dat names(raw_df) # názvy sloupců dim(raw_df) # počet řádků a sloupců
Při kontrole dat se zaměřte na:
- sloupce importované s nesprávným datovým typem;
- chybějící hodnoty zaznamenané pomocí několika různých kódů;
- duplicitní řádky nebo opakující se identifikátory;
- neočekávané rozdíly v pravopisu nebo používání velkých a malých písmen v kategoriích;
- nemožné hodnoty, například záporný průměr stromu nebo datum mimo období výzkumu;
- chybějící, smíšené nebo nezdokumentované jednotky;
- řádky obsahující poznámky, mezisoučty nebo metadata namísto jednotlivých pozorování.
Konzistentní názvy a datové typy jsou nezbytné pro spolehlivou analýzu. Názvy proměnných by měly být stručné, ale výstižné, měly by používat jednotnou konvenci pojmenování a neměly by obsahovat mezery. Funkce janitor::clean_names() převádí názvy do jednotného formátu snake_case.
clean_df <- raw_df |> clean_names() names(clean_df)
Převeďte každou proměnnou na datový typ potřebný pro analýzu. Výsledek vždy zkontrolujte, protože při převodu mohou vzniknout chybějící hodnoty, pokud některou hodnotu nelze správně převést do požadovaného formátu.
clean_df <- clean_df |>
mutate(
tree_id = as.character(tree_id),
site = as.factor(site),
diameter_cm = as.numeric(diameter_cm),
alive = as.logical(alive)
)
summary(clean_df)
Upozornění: Nepřevádějte faktor přímo na číselný datový typ pomocí as.numeric() pokud nechcete získat kódy jednotlivých faktorů. Nejprve faktor převeďte na textový datový typ a teprve poté na číselný.
Výběrem podmnožiny dat vytvoříte přehlednější pracovní tabulku a zároveň zachováte kompletní importovaný datový soubor. Místo ručního mazání řádků nebo sloupců používejte explicitně zapsaný kód.
analysis_df select(ozone, solar_r, wind, temp, month, day) |> filter(!is.na(ozone), temp > 70) |> arrange(month, day)
Mezi běžné operace pro úpravu struktury dat patří:
select(clean_df, ozone, wind, temp) # ponechání vybraných sloupců filter(clean_df, month == 7) # ponechání odpovídajících řádků slice(clean_df, 1:10) # výběr řádků podle pozice arrange(clean_df, desc(temp)) # seřazení řádků distinct(clean_df) # odstranění zcela duplicitních řádků relocate(clean_df, month, day) # přesunutí sloupců rename(clean_df, temperature_f = temp) # přejmenování proměnné mutate(clean_df, temp_c = (temp - 32) * 5/9) # vytvoření nové proměnné
S chybějícími hodnotami je třeba zacházet podle toho, co znamenají a jaká analýza má být provedena. Odstranění všech řádků obsahujících chybějící hodnotu je ve většině případů nevhodné. Nejprve zjistěte, kde se chybějící hodnoty vyskytují, a poté rozhodněte, zda je ponechat, vyloučit, překódovat nebo nahradit pomocí imputace. Důvod každého takového rozhodnutí zaznamenejte.
# Spočítání chybějících hodnot v jednotlivých sloupcích clean_df |> summarise(across(everything(), ~ sum(is.na(.)))) # Inspect rows with a missing ozone measurement clean_df |> filter(is.na(ozone)) # Remove rows only when ozone is essential for this analysis analysis_df filter(!is.na(ozone))
Funkci replace_na() používejte pouze tehdy, pokud má nahrazení chybějící hodnoty jednoznačný význam. Například nahrazení chybějícího počtu nulou je správné pouze tehdy, pokud chybějící hodnota skutečně znamená, že nebylo nic pozorováno, nikoli že pozorování nebylo vůbec provedeno.
# Example: label missing homeworld values explicitly as "Unknown" text_example select(name, homeworld) |> mutate(homeworld = replace_na(homeworld, "Unknown")) head(text_example)
Drobné rozdíly v mezerách, pravopisu nebo používání velkých a malých písmen vedou ke vzniku samostatných kategorií. Textové řetězce proto vyčistěte ještě před jejich převodem na faktory nebo před výpočtem souhrnných statistik podle skupin.
# starwars is included with dplyr and contains text categories text_example select(name, sex, homeworld) |> mutate( name = str_squish(name), homeworld = str_to_title(homeworld), sex = str_to_lower(sex) ) count(text_df, sex, sort = TRUE)
Pokud je třeba sjednotit větší množství kategoriálních označení, používejte zdokumentovanou převodní tabulku. Tento postup je přehlednější a lépe kontrolovatelný než uvádět desítky jednotlivých nahrazení přímo v jednom skriptu.
Datumy importované jako text je nutné převést na odpovídající datový typ Date nebo typ pro datum a čas. Zvolte funkci pro převod, která odpovídá pořadí jednotlivých částí data ve zdrojových datech.
clean_df mutate( sampling_date = make_date(1973, month, day), year = year(sampling_date), month_label = month(sampling_date, label = TRUE), day_of_year = yday(sampling_date) )
Pro formát rok–měsíc–den použijte funkci ymd(), pro měsíc–den–rok funkci mdy() a pro den–měsíc–rok funkci dmy(). Po převodu zkontrolujte nejmenší a největší datum a také počet chybějících hodnot v datech.
range(clean_df$sampling_date, na.rm = TRUE) sum(is.na(clean_df$sampling_date))
Přesně duplicitní záznam nemusí být vždy chybou a opakující se identifikátor může být v longitudinálních datech nebo při opakovaných měřeních zcela oprávněný. Nejprve proto určete, která kombinace proměnných má být v rámci dané studie jedinečná.
# Počet přesně duplicitních řádků sum(duplicated(clean_df)) # Potenciálně duplicitní pozorování podle zvoleného klíče clean_df |> count(month, day) |> filter(n > 1) # Repeated identifiers can be valid: see the built-in ChickWeight data ChickWeight |> count(Chick) |> arrange(desc(n)) |> head()
Ověřte také, zda hodnoty spadají do věrohodných rozsahů a zda kategoriální proměnné obsahují pouze povolené hodnoty. Podezřelé hodnoty raději označte ke kontrole, než abyste je bez zdokumentování odstranili.
quality_flags mutate( ozone_flag = ozone > 150 ) quality_flags |> filter(ozone_flag)
Čištění dat je dokončeno až po důkladné kontrole výsledného datového souboru. Porovnejte počty řádků před a po čištění, zkontrolujte rozdělení hodnot a jednotlivé kategorie a ověřte, že všechny provedené transformace vedly k zamýšlenému výsledku.
nrow(raw_df) nrow(clean_df) summary(clean_df) count(clean_df, month, sort = TRUE) sum(duplicated(clean_df)) clean_df |> summarise( n = n(), mean_ozone = mean(ozone, na.rm = TRUE), minimum_temp = min(temp, na.rm = TRUE), maximum_temp = max(temp, na.rm = TRUE) )
Vizuální kontrola může odhalit odlehlé hodnoty, asymetrická rozdělení, mezery v datech, nespojitosti nebo chyby v kódování, které lze v tabulce jen obtížně rozpoznat.
ggplot(clean_df, aes(x = temp, y = ozone)) + geom_point() + geom_smooth(method = "loess", se = FALSE) + labs( title = "Relationship between temperature and ozone", x = "Temperature (°F)", y = "Ozone" ) + theme_minimal()
Výběr vhodného grafu
| Účel | Typické proměnné | ggplot2 |
|---|---|---|
| Porovnání četností mezi kategoriemi | jedna kategoriální proměnná | geom_bar() |
| Porovnání rozdělení mezi skupinami | číselná + kategoriální proměnná | geom_boxplot() nebo geom_violin() |
| Zkoumání vztahu mezi číselnými proměnnými | dvě číselné proměnné | geom_point() |
| Zobrazení změny v čase | datum/čas + číselná proměnná | geom_line() |
| Porovnání více panelů se stejným uspořádáním | jedna nebo více seskupovacích proměnných | facet_wrap() nebo facet_grid() |
Nativní operátor v R, |>, předává výsledek jednoho kroku do kroku následujícího. Díky tomu lze skript číst shora dolů jako posloupnost zdokumentovaných rozhodnutí a úprav. Vytvářejte nový objekt namísto přepisování původního objektu raw_df.
clean_df clean_names() |> mutate( sampling_date = make_date(1973, month, day), temp_c = (temp - 32) * 5/9 ) |> filter(!is.na(ozone)) |> distinct() |> arrange(sampling_date)
Vyčištěná data exportujte do složky určené pro zpracovaná data. Pro tabulková data jsou obvykle vhodné otevřené, strojově čitelné formáty, například CSV nebo TSV. Pokud je důležité zachovat datové typy, třídy a další atributy objektů v R, uložte si navíc pracovní kopii ve formátu specifickém pro R.
dir.create("data_processed", showWarnings = FALSE)
write_csv(clean_df, "data_processed/airquality_clean.csv")
saveRDS(clean_df, "data_processed/airquality_clean.rds")
Soubor README a datový slovník by měly obsahovat:
- účel a rozsah datového souboru;
- informace o tom, kdo data shromáždil nebo vytvořil a kdy;
- význam, jednotky a povolené hodnoty každé proměnné;
- kódy používané pro označení chybějících hodnot v původních datech;
- všechna důležitá pravidla pro čištění, vylučování a transformaci dat;
- verze softwaru a balíčků potřebné k reprodukci pracovního postupu;
- licenci, podmínky přístupu a doporučený způsob citování;
- vztahy mezi původními soubory, zpracovanými soubory, skripty a výstupy.
Průběžně aktualizovaná dokumentace: README a datový slovník aktualizujte pokaždé, když se změní datový soubor, pracovní postup nebo struktura souborů. Dokumentace vytvořená až na konci projektu bývá často neúplná.
Následující skript spojuje hlavní kroky do jednoho reprodukovatelného pracovního postupu. Názvy proměnných a pravidla pro kontrolu dat přizpůsobte svému skutečnému datovému souboru. Nekopírujte je bez předchozí kontroly a posouzení jejich vhodnosti pro vaše data.
library(tidyverse)
library(janitor)
library(lubridate)
library(stringr)
library(skimr)
# 1. Import a dataset included with R
raw_df
clean_names() |>
mutate(
sampling_date = make_date(1973, month, day),
temp_c = (temp - 32) * 5/9
) |>
distinct() |>
arrange(sampling_date)
# 4. Ověření
stopifnot(all(clean_df$temp > 0, na.rm = TRUE))
stopifnot(!anyDuplicated(clean_df[c("month", "day")]))
clean_df |>
summarise(across(everything(), ~ sum(is.na(.)))) |>
print()
# 5. Export
dir.create("data_processed", showWarnings = FALSE)
write_csv(clean_df, "data_processed/airquality_clean.csv")
saveRDS(clean_df, "data_processed/airquality_clean.rds")
Časté chyby, kterým je třeba se vyhnout
- Ruční úpravy původní tabulky: Provedené změny nelze reprodukovat a může dojít ke ztrátě původních informací.
- Přepisování objektu s původními daty: Use
raw_dfandclean_dfjako samostatné objekty, aby původní importovaná data zůstala zachována. - Záměna = a ==: = slouží k přiřazení hodnoty nebo pojmenování argumentu, zatímco == testuje rovnost.
- Ignorování varování při převodu dat: Varování často upozorňují na hodnoty, které se při převodu změnily na NA.
- Odstraňování chybějících hodnot bez zdůvodnění: Výskyt chybějících hodnot může sám o sobě nést důležitou informaci a jejich neuvážené odstraňování může vést ke zkreslení výsledků.
- Používání barev nebo formátování jako dat: Kategorie ukládejte do samostatných sloupců, nikoli pomocí barev buněk, typů písma, formátování nebo komentářů.
- Automatické odstraňování opakujících se identifikátorů: Opakující se identifikátory mohou představovat opakovaná měření a nemusí být chybou.
- Nekonzistentní používání set.seed(): Před postupy zahrnujícími náhodný výběr, simulace nebo imputaci nastavte počáteční hodnotu generátoru náhodných čísel pomocí set.seed().
- Nezaznamenávání informací o relaci R: Verze balíčků mohou ovlivnit výsledky, proto informace o nich zaznamenejte ve zprávě nebo v dokumentaci projektu.
Dobrá praxe reprodukovatelného výzkumu
Nesnažte se zapamatovat všechny funkce v R. Důležitější je osvojit si posloupnost kroků spolehlivého pracovního postupu: zachovat původní data, importovat, zkontrolovat, vyčistit, ověřit, zdokumentovat a exportovat. Jako pomůcky používejte skripty, nápovědu, dokumentaci balíčků a stručné přehledy funkcí. Cílem není pouze jednorázově vytvořit vyčištěnou tabulku, ale vytvořit reprodukovatelný postup, kterému může porozumět jiný uživatel a který lze kdykoli znovu spustit z původních dat.
Stáhnout RStudio CheatSheet (EN)