Lập trình với R: Matrices và Data Frames

Matrices and Data Frames

Matrices and Data Frames


Trong bài viết này, chúng ta sẽ khảo sát về matrices và data frames. Cả hai đều biểu diễn cấu trúc dữ liệu dạng bảng (rectangular), nghĩa là chúng được sử dụng để lưu trữ dữ liệu gồm các dòng và cột. Sự khác biệt duy nhất giữa matrices và data frames đó là matrices chỉ có thể chứa duy nhất một kiểu dữ liệu, trong khi data frames có thể chứa nhiều kiểu dữ liệu khác nhau.

Matrices

Tạo một vector chứa các số từ 1 đến 20 bằng toán tử “:”. Lưu kết quả vào biến có tên my_vector.

my_vector <- 1:20
# kiểm tra số phần tử của my_vector
length(my_vector)
[1] 20

Ta không thể dùng hàm dim(my_vector) để kiểm tra số chiều của my_vector vì my_vector không có thuộc tính dim, tuy nhiên ta có thể sử dụng hàm length() để kiểm tra số lượng phần tử. Nhưng nếu chúng ta muốn my_vector có thuộc tính dim() ta vẫn có thể làm như sau:

# lưu ý 4 x 5 = 20 (số lượng phần tử của my_vector)
dim(my_vector) <- c(4, 5)

Khi đó, ta có thể truy xuất được thuộc tính dim() của my_vector

dim(my_vector)
[1] 4 5

attributes(my_vector)
$dim
[1] 4 5

Khi thao tác trên dữ liệu 2-chiều (bảng dữ liệu hình chữ nhật), giá trị đầu tiên cho biết số dòng dữ liệu, giá trị thứ hai cho biết số cột dữ liệu. Do đó, my_vector có 4 dòng và 5 cột.

Nhưng chờ đã. Có vẻ như my_vector không còn là một vector nữa. Vâng, không phải. Bây giờ nó là một ma trận (matrix). Ta có thể xem ma trận my_vector như thế nào:

my_vector
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

# kiểm tra kiểu dữ liệu của my_vector
class(my_vector)
[1] "matrix"

# lưu vào biến mới để dễ hiểu hơn
my_matrix <- my_vector

Qua ví dụ trên ta có thể thấy một điều đó là ma trận chỉ đơn giản là một vector nhưng có thêm thuộc tính dim (số chiều dữ liệu). Tương tự, ta có thể tạo ra một matrix bằng cách sử dụng hàm matrix().

# tạo một ma trận gồm 4 dòng và 5 cột
my_matrix2 <- matrix(1:20, nrow=4, ncol=5)

# kiểm tra hai ma trận có đồng nhất
identical(my_matrix, my_matrix2)
[1] TRUE

Bây giờ, ta xem các giá trị trong bảng dữ liệu trên chứa thông tin một thí nghiệm lâm sàng. Trong đó, mỗi dòng thể hiện một bệnh nhân và mỗi cột thể hiện thông tin liên quan đến bệnh nhân đó. Ta sẽ đánh nhãn mỗi dòng dữ liệu tương ứng với tên của từng bệnh nhân. Để dễ quan sát, ta thêm một cột dữ liệu chứa tên của các bệnh nhân.

# tạo danh sách tên các bệnh nhân
patients <- c("Bill", "Gina", "Kelly", "Sean")

Bây giờ, ta dùng hàm cbind() để thêm cột vào bảng dữ liệu. Khi đó, ta sẽ có kết quả như sau:

cbind(patients, my_matrix)
      patients                       
[1,] "Bill"   "1" "5" "9"  "13" "17"
[2,] "Gina"   "2" "6" "10" "14" "18"
[3,] "Kelly"  "3" "7" "11" "15" "19"
[4,] "Sean"   "4" "8" "12" "16" "20"

Khi thêm cột dữ liệu mới ta thấy rằng các dữ liệu trong bảng đều bị ép kiểu sang kiểu character, được thể hiện bởi dấu nháy kép. Ta biết rằng matrices chỉ có thể chứa duy nhất một kiểu dữ liệu. Vì vậy, khi ta cố thêm một cột dữ liệu có kiểu là character thì R sẽ tự động ép kiểu (implicit coercion) my_matrix về character để dữ liệu bên trong matrix đều cùng thuộc một kiểu dữ liệu.

Vậy, làm thế nào để khi thêm cột thuộc tính patients vào bảng dữ liệu ban đầu mà không làm thay đổi kiểu dữ liệu trước đó?

Data frames

Ta sử dụng data frame.

my_data <- data.frame(patients, my_matrix)
my_data 
  patients X1 X2 X3 X4 X5
1     Bill  1  5  9 13 17
2     Gina  2  6 10 14 18
3    Kelly  3  7 11 15 19
4     Sean  4  8 12 16 20

# kiểm tra kiểu dữ liệu của my_data
[1] "data.frame"

Kế tiếp, ta thử gán tên cho các cột dữ liệu tương ứng với các nhãn sau:

# danh sách tên các cột dữ liệu
cnames <- c("patient", "age", "weight", "bp", "rating", "test")

# đặt tên cho các cột dữ liệu tương ứng
colnames(my_data) <- cnames
my_data
  patient age weight bp rating test
1    Bill   1      5  9     13   17
2    Gina   2      6 10     14   18
3   Kelly   3      7 11     15   19
4    Sean   4      8 12     16   20

Qua bài viết trên, chúng ta đã biết cách làm việc với hai kiểu dữ liệu quan trọng đó là matrices và data frames. Chúng ta sẽ tìm hiểu kĩ hơn về hai kiểu dữ liệu này ở các bài viết trong tương lai.

Nguồn tham khảo: http://swirlstats.com/

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s