Phân tích dữ liệu lớn - Giới thiệu về R
Phần này dành để giới thiệu cho người dùng về ngôn ngữ lập trình R. R có thể được tải xuống từ trang web cran . Đối với người dùng Windows, việc cài đặt rtools và IDE rstudio sẽ rất hữu ích .
Khái niệm chung đằng sau R là để phục vụ như một giao diện cho phần mềm khác được phát triển bằng các ngôn ngữ biên dịch như C, C ++ và Fortran và cung cấp cho người dùng một công cụ tương tác để phân tích dữ liệu.
Điều hướng đến thư mục của tệp zip sách bda/part2/R_introduction và mở R_introduction.Rprojtập tin. Điều này sẽ mở một phiên RStudio. Sau đó, mở tệp 01_vectors.R. Chạy từng dòng kịch bản và làm theo các nhận xét trong mã. Một tùy chọn hữu ích khác để học là chỉ cần nhập mã, điều này sẽ giúp bạn làm quen với cú pháp R. Trong R chú thích được viết với ký hiệu #.
Để hiển thị kết quả chạy mã R trong sách, sau khi mã được đánh giá, kết quả R trả về được nhận xét. Bằng cách này, bạn có thể sao chép, dán mã vào sách và thử trực tiếp các phần của nó trong R.
# Create a vector of numbers
numbers = c(1, 2, 3, 4, 5)
print(numbers)
# [1] 1 2 3 4 5
# Create a vector of letters
ltrs = c('a', 'b', 'c', 'd', 'e')
# [1] "a" "b" "c" "d" "e"
# Concatenate both
mixed_vec = c(numbers, ltrs)
print(mixed_vec)
# [1] "1" "2" "3" "4" "5" "a" "b" "c" "d" "e"
Hãy phân tích những gì đã xảy ra trong đoạn mã trước. Chúng ta có thể thấy rằng có thể tạo ra các vectơ bằng số và bằng chữ cái. Chúng ta không cần phải cho R biết trước kiểu dữ liệu mà chúng ta muốn. Cuối cùng, chúng ta đã có thể tạo một vector có cả số và chữ. Vector mix_vec đã ép buộc các số thành ký tự, chúng ta có thể thấy điều này bằng cách hình dung cách các giá trị được in bên trong dấu ngoặc kép.
Đoạn mã sau đây hiển thị kiểu dữ liệu của các vectơ khác nhau do lớp hàm trả về. Người ta thường sử dụng hàm lớp để "thẩm vấn" một đối tượng, hỏi anh ta xem lớp của anh ta là gì.
### Evaluate the data types using class
### One dimensional objects
# Integer vector
num = 1:10
class(num)
# [1] "integer"
# Numeric vector, it has a float, 10.5
num = c(1:10, 10.5)
class(num)
# [1] "numeric"
# Character vector
ltrs = letters[1:10]
class(ltrs)
# [1] "character"
# Factor vector
fac = as.factor(ltrs)
class(fac)
# [1] "factor"
R cũng hỗ trợ các đối tượng hai chiều. Trong đoạn mã sau, có các ví dụ về hai cấu trúc dữ liệu phổ biến nhất được sử dụng trong R: ma trận và data.frame.
# Matrix
M = matrix(1:12, ncol = 4)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12
lM = matrix(letters[1:12], ncol = 4)
# [,1] [,2] [,3] [,4]
# [1,] "a" "d" "g" "j"
# [2,] "b" "e" "h" "k"
# [3,] "c" "f" "i" "l"
# Coerces the numbers to character
# cbind concatenates two matrices (or vectors) in one matrix
cbind(M, lM)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,] "1" "4" "7" "10" "a" "d" "g" "j"
# [2,] "2" "5" "8" "11" "b" "e" "h" "k"
# [3,] "3" "6" "9" "12" "c" "f" "i" "l"
class(M)
# [1] "matrix"
class(lM)
# [1] "matrix"
# data.frame
# One of the main objects of R, handles different data types in the same object.
# It is possible to have numeric, character and factor vectors in the same data.frame
df = data.frame(n = 1:5, l = letters[1:5])
df
# n l
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
Như đã trình bày trong ví dụ trước, có thể sử dụng các kiểu dữ liệu khác nhau trong cùng một đối tượng. Nói chung, đây là cách dữ liệu được trình bày trong cơ sở dữ liệu, các API một phần của dữ liệu là văn bản hoặc vectơ ký tự và số khác. Công việc của nhà phân tích là xác định kiểu dữ liệu thống kê nào cần gán và sau đó sử dụng kiểu dữ liệu R chính xác cho nó. Trong thống kê, chúng ta thường coi các biến thuộc các loại sau:
- Numeric
- Danh nghĩa hoặc phân loại
- Ordinal
Trong R, một vectơ có thể thuộc các lớp sau:
- Numeric - Integer
- Factor
- Yếu tố thứ tự
R cung cấp một kiểu dữ liệu cho mỗi kiểu thống kê của biến. Tuy nhiên, yếu tố có thứ tự hiếm khi được sử dụng, nhưng có thể được tạo bởi yếu tố chức năng hoặc có thứ tự.
Phần sau đây đề cập đến khái niệm lập chỉ mục. Đây là một thao tác khá phổ biến và giải quyết vấn đề chọn các phần của một đối tượng và thực hiện các phép biến đổi cho chúng.
# Let's create a data.frame
df = data.frame(numbers = 1:26, letters)
head(df)
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 6 f
# str gives the structure of a data.frame, it’s a good summary to inspect an object
str(df)
# 'data.frame': 26 obs. of 2 variables:
# $ numbers: int 1 2 3 4 5 6 7 8 9 10 ...
# $ letters: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
# The latter shows the letters character vector was coerced as a factor.
# This can be explained by the stringsAsFactors = TRUE argumnet in data.frame
# read ?data.frame for more information
class(df)
# [1] "data.frame"
### Indexing
# Get the first row
df[1, ]
# numbers letters
# 1 1 a
# Used for programming normally - returns the output as a list
df[1, , drop = TRUE]
# $numbers
# [1] 1
#
# $letters
# [1] a
# Levels: a b c d e f g h i j k l m n o p q r s t u v w x y z
# Get several rows of the data.frame
df[5:7, ]
# numbers letters
# 5 5 e
# 6 6 f
# 7 7 g
### Add one column that mixes the numeric column with the factor column
df$mixed = paste(df$numbers, df$letters, sep = ’’)
str(df)
# 'data.frame': 26 obs. of 3 variables:
# $ numbers: int 1 2 3 4 5 6 7 8 9 10 ...
# $ letters: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...
# $ mixed : chr "1a" "2b" "3c" "4d" ...
### Get columns
# Get the first column
df[, 1]
# It returns a one dimensional vector with that column
# Get two columns
df2 = df[, 1:2]
head(df2)
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 6 f
# Get the first and third columns
df3 = df[, c(1, 3)]
df3[1:3, ]
# numbers mixed
# 1 1 1a
# 2 2 2b
# 3 3 3c
### Index columns from their names
names(df)
# [1] "numbers" "letters" "mixed"
# This is the best practice in programming, as many times indeces change, but
variable names don’t
# We create a variable with the names we want to subset
keep_vars = c("numbers", "mixed")
df4 = df[, keep_vars]
head(df4)
# numbers mixed
# 1 1 1a
# 2 2 2b
# 3 3 3c
# 4 4 4d
# 5 5 5e
# 6 6 6f
### subset rows and columns
# Keep the first five rows
df5 = df[1:5, keep_vars]
df5
# numbers mixed
# 1 1 1a
# 2 2 2b
# 3 3 3c
# 4 4 4d
# 5 5 5e
# subset rows using a logical condition
df6 = df[df$numbers < 10, keep_vars]
df6
# numbers mixed
# 1 1 1a
# 2 2 2b
# 3 3 3c
# 4 4 4d
# 5 5 5e
# 6 6 6f
# 7 7 7g
# 8 8 8h
# 9 9 9i