21  Робота з неіменованими та “поганоіменованими” даними


author: Юрій Клебан


21.1 Іменування даних

Першим прикладом проблем у даних можна розгянути читання неіменованих даних, тобто стопці таблиці не мають заголовків у файлі.

Створимо такий файл у блокноті і зчитаємо його:

data <- read.csv("data/untitled.csv")
data
A data.frame: 5 × 4
X23 X185 X85.7 Male
<int> <chr> <dbl> <chr>
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F

Зверніть увагу, що у якості стовпців взято перший рядок даних у додано X на початку. Зчитаємо дані із параметром, що вказує на відсутність заголовків:

data <- read.csv("data/untitled.csv", header = FALSE)
data
A data.frame: 6 × 4
V1 V2 V3 V4
<int> <chr> <dbl> <chr>
23 185 85.7 Male
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F

Проблема іменування не вирішена, дані ми уже не втратили. Передамо одночасно з читанням інформацію про назви стовпців:

data <- read.csv("data/untitled.csv", 
            header = FALSE,
            col.names = c("Age","Height", "Weight", "Gender"))
data
A data.frame: 6 × 4
Age Height Weight Gender
<int> <chr> <dbl> <chr>
23 185 85.7 Male
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F

Ще одним варіантом задання назв стовпців є використання функції colnames() як для усіх різом, так і для окремого:

colnames(data) <- c("age", "height", "width", "gender")
data
colnames(data)[2] <- "HEIGHT"
data
A data.frame: 6 × 4
age height width gender
<int> <chr> <dbl> <chr>
23 185 85.7 Male
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F
A data.frame: 6 × 4
age HEIGHT width gender
<int> <chr> <dbl> <chr>
23 185 85.7 Male
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F

Також змінювати назви стовпців можна за допомогою функції rename() з пакету dplyr:

library(dplyr)

data <- data |> rename(AGE = age)
data
A data.frame: 6 × 4
AGE HEIGHT width gender
<int> <chr> <dbl> <chr>
23 185 85.7 Male
41 175 68.3 M
11 142* 55.4 Female
12 NA 48.2 Man
54 171 NA Looks like a man
32 168 78.0 F

21.2 Заміна назв стовпців data.frame

Зчитаємо файл, що містить інформацію про осіб, але уже має іменовані стовпці:

data <- read.csv("data/badtitled.csv")
data
A data.frame: 13 × 5
Person.Age Person__Height person.Weight Person.Gender empty
<int> <chr> <dbl> <chr> <lgl>
23 185 NA Male NA
41 175 68.3 M NA
11 142* 55.4 Female NA
12 NA 48.2 Man NA
54 191 NA female NA
32 168 78.0 F NA
22 NA 54.0 male. NA
21 165 NA m NA
14 NA 90.2 Man NA
51 250 NA female NA
41 20 81.0 F NA
66 NA 59.0 male. NA
71 171 NA m NA

Швидко змінити назви стовпців та привести їх до однакового стилю можна за домогою бібліотеки janitor:

#install.packages("janitor")
library(janitor)
clean <- clean_names(data)
colnames(clean)
  1. 'person_age'
  2. 'person_height'
  3. 'person_weight'
  4. 'person_gender'
  5. 'empty'

21.3 Набори даних

  1. https://github.com/kleban/r-book-published/tree/main/datasets/untitled.csv
  2. https://github.com/kleban/r-book-published/tree/main/datasets/badtitled.csv
  3. https://github.com/kleban/r-book-published/tree/main/datasets/cleaned_titled.csv
  4. https://github.com/kleban/r-book-published/tree/main/datasets/cleaned_titled2.csv
  5. https://github.com/kleban/r-book-published/tree/main/datasets/river_eco.csv

21.4 Використані та додаткові джерела

  1. KPMG Virtual Internship
  2. An introduction to data cleaning with R / Edwin de Jonge, Mark van der Loo, 2013
  3. Anomaly Detection in R
  4. K-nearest Neighbor: The maths behind it, how it works and an example
  5. Quantile. Wikipedia