Trong quá trình phân tích dữ liệu thực tế, chúng ta sẽ thường gặp phải vấn đề missing values. Trong bài viết trước, mình đã chia sẻ một số tips xử lý missing values, các bạn có thể tham khảo tại đây
Tuy nhiên, câu hỏi đặt ra lúc này là giả sử dữ liệu của chúng ta có rất nhiều biến có missing values, vậy thì làm thế nào để thay thế missing values ở hàng loạt các biến cùng một lúc?
Trong bài viết này, mình sẽ chia sẻ với các bạn cách giải quyết vấn đề nói trên.
Lấy mẫu 10 quan sát đầu tiên của dữ liệu iris có sẵn
trong R để thực hành.
library(dplyr)
set.seed(1)
data <- iris %>% sample_n(10)
data## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.8 2.7 4.1 1.0 versicolor
## 2 6.4 2.8 5.6 2.1 virginica
## 3 4.4 3.2 1.3 0.2 setosa
## 4 4.3 3.0 1.1 0.1 setosa
## 5 7.0 3.2 4.7 1.4 versicolor
## 6 5.4 3.0 4.5 1.5 versicolor
## 7 5.4 3.4 1.7 0.2 setosa
## 8 7.6 3.0 6.6 2.1 virginica
## 9 6.1 2.8 4.7 1.2 versicolor
## 10 4.6 3.4 1.4 0.3 setosa
Thêm một biến mới class vào tập dữ liệu.
data <- data %>%
mutate(class = case_when(
Species == "setosa" ~ "1",
Species == "versicolor" ~ "2",
TRUE ~ "3"
) %>% as.factor)
data## Sepal.Length Sepal.Width Petal.Length Petal.Width Species class
## 1 5.8 2.7 4.1 1.0 versicolor 2
## 2 6.4 2.8 5.6 2.1 virginica 3
## 3 4.4 3.2 1.3 0.2 setosa 1
## 4 4.3 3.0 1.1 0.1 setosa 1
## 5 7.0 3.2 4.7 1.4 versicolor 2
## 6 5.4 3.0 4.5 1.5 versicolor 2
## 7 5.4 3.4 1.7 0.2 setosa 1
## 8 7.6 3.0 6.6 2.1 virginica 3
## 9 6.1 2.8 4.7 1.2 versicolor 2
## 10 4.6 3.4 1.4 0.3 setosa 1
Giả sử, chúng ta sửa dòng thứ 1 và dòng thứ 3 của tập dữ liệu thành
các giá trị NA, để sau đó chúng ta xử lý.
data[c(1,3),] <- NA
data## Sepal.Length Sepal.Width Petal.Length Petal.Width Species class
## 1 NA NA NA NA <NA> <NA>
## 2 6.4 2.8 5.6 2.1 virginica 3
## 3 NA NA NA NA <NA> <NA>
## 4 4.3 3.0 1.1 0.1 setosa 1
## 5 7.0 3.2 4.7 1.4 versicolor 2
## 6 5.4 3.0 4.5 1.5 versicolor 2
## 7 5.4 3.4 1.7 0.2 setosa 1
## 8 7.6 3.0 6.6 2.1 virginica 3
## 9 6.1 2.8 4.7 1.2 versicolor 2
## 10 4.6 3.4 1.4 0.3 setosa 1
# Định dạng các biến trong tập dữ liệu
data %>% str## 'data.frame': 10 obs. of 6 variables:
## $ Sepal.Length: num NA 6.4 NA 4.3 7 5.4 5.4 7.6 6.1 4.6
## $ Sepal.Width : num NA 2.8 NA 3 3.2 3 3.4 3 2.8 3.4
## $ Petal.Length: num NA 5.6 NA 1.1 4.7 4.5 1.7 6.6 4.7 1.4
## $ Petal.Width : num NA 2.1 NA 0.1 1.4 1.5 0.2 2.1 1.2 0.3
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: NA 3 NA 1 2 2 1 3 2 1
## $ class : Factor w/ 3 levels "1","2","3": NA 3 NA 1 2 2 1 3 2 1
Như vậy, dữ liệu mới của chúng ta bây giờ tại tất cả các biến đều có missing values. Bốn biến đầu tiên là biến liên tục (numeric), hai biến cuối cùng là biến rời rạc (factor).
Giả sử, đối với những biến liên tục (numeric) trong dữ
liệu, chúng ta sẽ thay thế missing values bằng giá trị 0
bằng câu lệnh sau:
data2 <- data %>%
mutate_if(is.numeric, # Áp dụng với các biến là numeric
# Những giá trị NA thay bằng 0
funs(case_when(
is.na(.) ~ 0,
TRUE ~ .
))
)
data2## Sepal.Length Sepal.Width Petal.Length Petal.Width Species class
## 1 0.0 0.0 0.0 0.0 <NA> <NA>
## 2 6.4 2.8 5.6 2.1 virginica 3
## 3 0.0 0.0 0.0 0.0 <NA> <NA>
## 4 4.3 3.0 1.1 0.1 setosa 1
## 5 7.0 3.2 4.7 1.4 versicolor 2
## 6 5.4 3.0 4.5 1.5 versicolor 2
## 7 5.4 3.4 1.7 0.2 setosa 1
## 8 7.6 3.0 6.6 2.1 virginica 3
## 9 6.1 2.8 4.7 1.2 versicolor 2
## 10 4.6 3.4 1.4 0.3 setosa 1
Hoặc nếu muốn thay thế missing values bằng giá trị
median, có thể dùng câu lệnh sau:
data %>%
mutate_if(is.numeric, # Áp dụng với các biến là numeric
# Những giá trị NA thay bằng median
funs(case_when(
is.na(.) ~ median(., na.rm = T),
TRUE ~ .
))
) ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species class
## 1 5.75 3.0 4.6 1.3 <NA> <NA>
## 2 6.40 2.8 5.6 2.1 virginica 3
## 3 5.75 3.0 4.6 1.3 <NA> <NA>
## 4 4.30 3.0 1.1 0.1 setosa 1
## 5 7.00 3.2 4.7 1.4 versicolor 2
## 6 5.40 3.0 4.5 1.5 versicolor 2
## 7 5.40 3.4 1.7 0.2 setosa 1
## 8 7.60 3.0 6.6 2.1 virginica 3
## 9 6.10 2.8 4.7 1.2 versicolor 2
## 10 4.60 3.4 1.4 0.3 setosa 1
Tương tự, đối với những biến rời rạc (factor) trong dữ
liệu, chúng ta sẽ thay thế missing values bằng giá trị
Missing, sử dụng câu lệnh sau:
data2 %>%
# Những biến factor cần convert về dạng character trước
mutate_if(is.factor, as.character) %>%
mutate_if(is.character,
funs(case_when(
is.na(.) ~ "Missing",
TRUE ~ .
))
)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species class
## 1 0.0 0.0 0.0 0.0 Missing Missing
## 2 6.4 2.8 5.6 2.1 virginica 3
## 3 0.0 0.0 0.0 0.0 Missing Missing
## 4 4.3 3.0 1.1 0.1 setosa 1
## 5 7.0 3.2 4.7 1.4 versicolor 2
## 6 5.4 3.0 4.5 1.5 versicolor 2
## 7 5.4 3.4 1.7 0.2 setosa 1
## 8 7.6 3.0 6.6 2.1 virginica 3
## 9 6.1 2.8 4.7 1.2 versicolor 2
## 10 4.6 3.4 1.4 0.3 setosa 1
Như vậy, mình vừa chia sẻ cách thay thế missing values bằng 1 giá trị
nhất định ở hàng loạt các biến cùng một lúc bằng việc kết hợp câu lệnh
mutate_if() và case_when().
Chúc các bạn học tập và làm việc hiệu quả!