R-008 data.frame trong R

Nội dung bài viết

data.frame là một những kiểu dữ liệu cơ bản của R.

Để hiểu rõ data.frame của R các bạn có thể đọc tài liệu chi tiết về data.frame bằng lệnh:

?data.frame

1. Tạo một data.frame:

DataFrame (tương tự như một bảng tính Excel hay DataFrame Pandas trong Python) trong R có thể tạo với hàm data.frame(...). Về cơ bản thì data.frame giống matrix chỉ có khác là các cột của data.frame có thể khác kiểu dữ liệu. Tạo data.frame từ các vector thì mặc định các cột sẽ lấy tên biến của vector:

book <- c("Xac suat thong ke", "Nhap mon lap trinh", "Phai trai dung sai")
year <- c(2015,2014,2017)
df <- data.frame(book, year)
df
                book year
1  Xac suat thong ke 2015
2 Nhap mon lap trinh 2014
3 Phai trai dung sai 2017

2. Truy cập thành phần trong data.frame

Tương tự như list bạn có thể truy cập các thành phần trong data.frame qua toán tử [[...]]...$key:

Dùng [[...]] cho data.frame

df[[2]]
[1] 2015 2014 2017

Hoặc dùng ...$key

df$book
[1] Xac suat thong ke  Nhap mon lap trinh Phai trai dung sai
Levels: Nhap mon lap trinh Phai trai dung sai Xac suat thong ke

Tương tự như matrix bạn có thể rút rowscols của data.frame bằng [vec.row, vec.col] như sau:

df[1:2,1:2]
                book year
1  Xac suat thong ke 2015
2 Nhap mon lap trinh 2014

3. Tải data.frame lên từ tập tin

R hổ trợ một số lệnh để tải một số tập tin bảng tính lên thành data.frame. Để đọc tập tin csv bạn có thể dùng hàm read.csv(...), lưu ý là cần xem working directory trong R trước đang ở thư mục nào, việc chỉnh lại thư mục đang làm việc có thể sử dụng RStudio qua Session -> Set Working Directory -> Choose Directory (hoặc tổ hợp phím Ctrl + Shift + H). Bạn có thể xem nhanh thư mục hiện tại mình đang làm việc bằng lệnh:

getwd()
[1] "C:/Users/quangtiencs/Documents"

Thường thì phiên làm việc mặc định ở thư mục Documents.

Đọc tập tin .csv thành data.frame:

my.df <- read.csv("ten cua file.csv")

4. Gộp hàng và cột

Tương tự matrix, chúng ta có thể gộp hàng và cột của data.frame bằng hàm rbind(...)cbind(...) như sau:

df1 <- data.frame(a=1:2, b=4:5)
df2 <- data.frame(a=7:9,b=15:17)
df3 <- data.frame(c=9:10, d=11:12)

Với rbind(...) gộp theo hàng:

rbind(df1, df2)
  a  b
1 1  4
2 2  5
3 7 15
4 8 16
5 9 17

Với cbind(...) gộp theo cột:

cbind(df1, df3)
  a b  c  d
1 1 4  9 11
2 2 5 10 12

5. Join hai data.frame

Trong các cơ sở dữ liệu quan hệ, một trong những toán tử quan trọng nhất là toán tử join để gộp hai bảng dữ liệu dựa trên những giá trị giống nhau của các biến.

R cung cấp một hàm rất hữu ích là hàm merge(...) hàm này cho phép join hai data.frame. Mặc định nếu không nói gì thêm thì phép join được sử dụng là inner join.

Xét hai bảng dữ liệu data.frame sau đây:

data <- data.frame(so.luong=1:3, ma.hang=c('A','D','Z'))
data.lookup <- data.frame(ma.hang=c('A', 'B', 'C', 'D'), gia.thanh=12:15)
data
data.lookup
# Bảng dữ liệu data
  so.luong ma.hang
1        1       A
2        2       D
3        3       Z

# Bảng dữ liệu data.lookup
  ma.hang gia.thanh
1       A        12
2       B        13
3       C        14
4       D        15

Xem sơ qua dữ liệu thì chúng ta thấy ở bảng dữ liệu đầu có mã hàng Z mà bảng dữ liệu giá thành thì lại không có. Vì mặc định là inner join nên sau khi join thì hàng Z sẽ biến mất:

merge(data, data.lookup)
  ma.hang so.luong gia.thanh
1       A        1        12
2       D        2        15