class: title-slide, left, bottom # Cách nhập dữ liệu vào R (tabular data) ---- ## **Khóa học: Hướng dẫn sử dụng R để xử lý dữ liệu** ### Biên soạn: Duc Nguyen (Tự học R chấm com) ### Đăng ký: tuhocr.com@gmail.com - Website: www.tuhocr.com --- class: inverse, middle, center # Import file Excel `.xlsx` into R Có nhiều hơn một cách để nhập dữ liệu. Hãy chọn cách mà bạn cảm thấy quen thuộc, dễ hiểu, thuận tiện. --- # Lệnh `library(readxl)` và `read_excel()` [Cách thực hiện](https://tanduc307.github.io/tuhocr/cach-nhap-du-lieu.htm) --- # Kiểm tra dữ liệu đầu vào [Cách thực hiện](https://tanduc307.github.io/tuhocr/kiem-tra-du-lieu.htm) --- class: inverse, middle, center # Import file text `.txt` into R Đáp ứng các nhu cầu nhập liệu khác nhau --- # Lệnh `read.table()` Minimal working example ```r dulieu <- read.table(file = "dulieu.txt", # Tên file .txt chứa dữ liệu header = TRUE, # Dòng đầu tiên có phải là tiêu đề hay không sep = "", # Ngăn cách giữa các cột là khoảng trắng quote = "\"'", # Xem các ký tự nháy đơn, nháy kép là string/text dec = ".", # Số thập phân trong file gốc sử dụng dấu chấm col.names = c("khoi_luong_cay", "nghiem_thuc"), # Đổi tên cột na.strings = "NA", # Ký hiệu missing value trong file gốc là NA colClasses = c("numeric", "character"), # Xác định đặc điểm dữ liệu nrows = -1, # Số hàng sẽ nhập dữ liệu (mặc định -1 là chọn hết toàn bộ) skip = 0, # Số lượng hàng dữ liệu được bỏ qua tính từ hàng đầu tiên comment.char = "#", # Ký hiệu chú thích trong file gốc stringsAsFactors = FALSE # Các biến `character` là dạng `factor` ) ``` --- # Lệnh `read.table()` Thông thường, ta chỉ cần các thông số/argument này là đủ. Sau đó tính tiếp. ```r getwd() # Kiểm tra thư mục làm việc # setwd() # → Có thể thiết lập thư mục làm việc (nếu cần) ``` ``` ## [1] "D:/GITHUB/book" ``` ```r dulieu <- read.table(file = "rbasics/full/dulieu.txt", header = TRUE, col.names = c("khoi_luong_cay", "nghiem_thuc"), na.strings = "NA", colClasses = c("numeric", "character") ) ``` --- class: inverse, middle, center # Import file CSV `.csv` into R CSV = Comma Separated Values --- # Lệnh `read.csv()` Các tham số tương tự như lệnh `read.table()` ```r ketqua <- read.csv(file = "ketqua.csv", header = TRUE, * sep = ",", # Các cột phân cách bởi dấu phẩy quote = "\"'", dec = ".", #col.names = c("khoi_luong_cay", "nghiem_thuc"), na.strings = "NA", #colClasses = c("numeric", "character"), # Turn off thông số không dùng nrows = -1, skip = 0, comment.char = "#", stringsAsFactors = FALSE, fill = TRUE # Nếu các hàng không bằng nhau sẽ để khoảng trống ) ``` --- # Tham số mặc định Nếu dữ liệu đơn giản, ta có thể dùng câu lệnh ngắn gọn mà không cần thiết lập tham số. `dulieu <- read.table("dulieu.txt")` R sẽ tự động (mặc định) cho các tham số: - Bỏ qua các dòng có comment `#` trong dữ liệu gốc - Tính xem có bao dòng và bộ nhớ RAM cần sử dụng - Tự xác định các cột trong file dữ liệu thuộc `class` nào (type of variable) --- # Làm việc với file dữ liệu lớn (large dataset) Ví dụ: Ta có 1 data frame gồm 2,500,000 hàng và 120 cột. Tính bộ nhớ RAM của máy tính đáp ứng được nhu cầu? Cách tính: <span style="color: blue"> 2,500,000 × 120 × 8 byte/numeric </span> <span style="color: blue"> = 2,400,000,000 bytes </span> <span style="color: blue"> = 2,400,000,000 / 2<sup>20</sup> </span> <span style="color: blue"> = 2,288.82 MB </span> <span style="color: blue"> = 2.24 GB </span> * 1 MB (megabye) = 2<sup>10</sup> KB (kilobyte) = 2<sup>20</sup> B (byte) [https://www.gbmb.org/mb-to-kb](https://www.gbmb.org/mb-to-kb) * 1 GB (gigabyte) = 2<sup>10</sup> MB = 1024 MB --- # Tăng tốc độ đọc dữ liệu (large dataset) Khi nhập dữ liệu thì R sẽ tự động xác định `colClasses` tương ứng với từng cột bằng cách rà soát toàn bộ các dòng dữ liệu trong đó rồi chọn `class` nào phù hợp. Ví dụ `interger` (nếu toàn bộ giá trị trong cột là số nguyên), `numeric` (nếu giá trị trong cột là số thực) hay `character`. Nếu chúng ta biết rõ đặc điểm của từng cột thì ta sẽ ghi tham số ngay từ đầu. Ví dụ, ta biết *chắc chắn* các cột trong bảng dữ liệu là `numeric` thì chỉ cần set tham số `colClasses = "numeric"`. Tuy nhiên trong bảng dữ liệu với rất nhiều cột với các `class` khác nhau thì việc này mất thời gian. Sử dụng cách tiếp cận sau giúp tăng tốc độ nhập dữ liệu gấp đôi so với bình thường. ```r data_small <- read.table("data_full.txt", nrows = 100) # Đọc trước 100 dòng đầu tiên data_small_class <- sapply(data_small, class) # Tách các `class` trong dữ liệu data_full <- read.table("data_full.txt", # Đọc lại file dữ liệu lớn, lấy toàn bộ colClasses = classes) # Gán lại các `class` được R xác định # từ bộ dữ liệu nhỏ ```