19/08/2020

Nội dung hôm nay

  • List
  • Factor
  • Missing data
  • Data Frame
  • Names

Lists

Lists

  • List là một dạng đặc biệt của Vector.

  • Nó chứa các giá trị thuộc các nhóm dữ liệu khác nhau.

  • List là dạng trình bày của các R Object đặc biệt. Ví dụ như mô hình Linear, mô hình Logistics.

  • Những R Object đặc biệt này phải ở dạng list vì nó chứa nhiều thông tin khác nhau. Đây cũng là đặc tính nổi trội của list.

  • Đặc tính nổi trội của List là chứa đựng rất nhiều thông tin đa dạng

  • Việc phân tích dữ liệu sẽ nhanh hơn rất nhiều khi sử dụng các hàm nhóm apply() làm việc với R Object dạng list.

Lists

x <- list(1, "a", TRUE, 1 + 4i)
x
## [[1]]
## [1] 1
## 
## [[2]]
## [1] "a"
## 
## [[3]]
## [1] TRUE
## 
## [[4]]
## [1] 1+4i
class(x)
## [1] "list"

Lists

Ta có thể tạo List trống với độ dài định sẵn với hàm vector()

x <- vector(mode = "list", length = 5) ## bản chất của list chính là vector
print(x)
## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
## NULL
## 
## [[4]]
## NULL
## 
## [[5]]
## NULL

Lists

Khi dùng lệnh View() để xem các Object dạng list ở cửa sổ Source, ta thấy cách trình bày giá trị của list khác với vector hay matrix

x <- list(1, "a", TRUE, 1 + 4i)

View(x, title = "List")

List

Số thứ tự giá trị của List được đặt trong dấu ngoặc vuông kép [[số thứ tự]]

Mỗi dấu phẩy là một thành phần Ví dụ một list có các thành phần với độ dài khác nhau

List - Linear model

x <- rnorm(1000) ; y <- rnorm(1000,10,20)
model <- lm(y~x)
summary(model)
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -70.457 -13.289   0.052  13.137  61.394 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   9.5922     0.6309  15.203   <2e-16 ***
## x            -0.5019     0.6156  -0.815    0.415    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.94 on 998 degrees of freedom
## Multiple R-squared:  0.0006655,  Adjusted R-squared:  -0.0003358 
## F-statistic: 0.6646 on 1 and 998 DF,  p-value: 0.4151

List - Linear model

model_info <- summary(model)

View(model_info)

# Factor

Factor

  • Cấu trúc Factor giúp trình bày dữ liệu dạng định tính theo thứ tự hoặc không theo thứ tự.

  • Factor quan trọng trong việc xây dựng mô hình, đặc biệt khi làm việc với các hàm mô hình như lm() hay glm().

  • Factor hoạt động như việc chúng ta gán nhãn giá trị (lab val) cho biến số có 2 giá trị (1 và 0 hoặc 2) trong Stata. Ví dụ như gán ‘Nam’ cho giá trị 1, và ‘Nữ’ cho giá trị 0 hoặc 2.

  • Factor hoạt động ngược lại với Stata. Chúng ta có một biến số nhóm character với 2 giá trị là ‘Nam’ và ‘Nữ’. ‘Nam’ sẽ được gán với giá trị 1, ‘Nữ’ được gán với giá trị 2. Nhìn chung, các giá trị sẽ được gán với một con số bắt đầu từ số 1.

  • Khác với dữ liệu dạng logic (TRUE/FALSE), các con số được gán này không thể dùng để tính toán đại số.

Factor

Dữ liệu Factor được tạo bằng hàm factor().

x <- factor(c("yes","yes","no","yes","no"))
x
## [1] yes yes no  yes no 
## Levels: no yes
attributes(x)
## $levels
## [1] "no"  "yes"
## 
## $class
## [1] "factor"
table(x)
## x
##  no yes 
##   2   3

Factor

Ở phần kết quả, chúng ta thấy ‘Levels: no yes’. Điều này có nghĩa ‘no’ tương ứng với 1, ‘yes’ tương ứng với 2. Nếu không có yêu cầu cụ thể, hàm factor() tự sắp xếp thứ tự theo vị trí của chữ cái đầu trong bảng chữ cái.

unclass(x)
## [1] 2 2 1 2 1
## attr(,"levels")
## [1] "no"  "yes"

Factor

x <- factor(c("yes","yes","no","yes","no"), levels = c("yes","no"))
x
## [1] yes yes no  yes no 
## Levels: yes no
### Hoặc chúng ta có thể sử dụng hàm levels() để xác định đặc tính của dữ liệu. 
## Điều này tương tự khi ta sử dụng hàm dim() để định dạng vector.

levels(x) <- c("no", "yes") 
x
## [1] no  no  yes no  yes
## Levels: no yes

Missing data

Missing data

  • Trong R, dữ liệu khuyết được định danh là NA (Not Applicable) hoặc NaN (Not a Number).

  • Chúng là những từ dành riêng (reserved word) trong R.

  • Từ dành riêng là những từ được R hiểu theo nghĩa đặc biệt. Điều này có nghĩa
    • Chúng có vai trò cụ thể.
    • Chuyển thành character nếu chúng ta sử dụng dấu nháy đôi.

Missing data

# Tất cả những chữ cái trong R đều cần dấu nháy đôi. Nếu không có, R sẽ không hiểu. 
"a"
## [1] "a"
x <- "a"
x
## [1] "a"

Missing data

# Tuy nhiên, nó vẫn hiểu Reserved words
NA; class(NA)
## [1] NA
## [1] "logical"
NaN; class(NaN)
## [1] NaN
## [1] "numeric"
x <- Inf ; x ; class(x)
## [1] Inf
## [1] "numeric"

Missing data

  • Những từ dành riêng thường sử dụng như
    • Nhóm logical, numeric: TRUE, FALSE
    • Nhóm numeric: NaN, Inf, -Inf
    • Nhóm tự do (có thể ở tất cả nhóm): NA. Như vậy ta sẽ có numeric NA, integer NA, character NA, etc.
  • Để kiểm tra một đối tượng có chứa dữ liệu khuyết, ta dùng
    • Hàm is.na() cho NA
    • Hàm is.nan() cho NaN

Missing data

# Tạo một vector chứa NA
x <- c(1,2,NA,10,3)
# Trả về một vector logic chỉ ra thành phần nào là NA
is.na(x)
## [1] FALSE FALSE  TRUE FALSE FALSE
# Trả về một vector logic chỉ ra thành phần nào là NaN
is.nan(x)
## [1] FALSE FALSE FALSE FALSE FALSE
# Bây giờ tạo một vector có cả giá trị NA và NaN
x <- c(1,2,NaN,NA,4) ; is.na(x) ; is.nan(x)
## [1] FALSE FALSE  TRUE  TRUE FALSE
## [1] FALSE FALSE  TRUE FALSE FALSE

Data Frame

Data frames

  • Data frames lưu trữ dữ liệu bảng - một dạng dữ liệu quan trong R.

  • Data Frames là một dạng trình bày đặc biệt của list - khi các thành phần của list có cùng độ dài.

  • Các thành phần của list được xem như là một cột. Độ dài của mỗi thành phần trong list là số hàng.

  • Khác với matrix, data frames có khá năng lưu trữ các nhóm đối tượng khác nhau ở các cột. Trong khi đó, các thành phần trong matrix phải cùng nhóm.

  • Thậm chí data frame có thê lưu trữ data frame như là một thành phần.

Data frame

Data frame có thể được tạo bằng hàm data.frame().

x <- data.frame(foo = 1:4, bar = c(T,T,F,F)); x
##   foo   bar
## 1   1  TRUE
## 2   2  TRUE
## 3   3 FALSE
## 4   4 FALSE
dim(x) # Tương tự như matrix, data frame có dimension
## [1] 4 2
nrow(x) ; ncol(x)  # number of row, number of collumn
## [1] 4
## [1] 2

Names

Names

  • R Object có thể được đặt tên.

  • Việc này sẽ thuận lợi trong việc truy xuất thông tin.

Names

v <- 1:3
v # Vector nhóm numeric, có ba giá trị 1,2,3
## [1] 1 2 3
names(v)
## NULL

Names

# Tương tự như dim() và level(), names() thuộc attributes của R object, và là một vector.
names(v) <- c("Ho Chi Minh", "Ha Noi", "Da Nang") 
v # Vector nhóm numeric, có ba giá trị 1,2,3 và tên tương ứng là "Hồ Chí Minh", "Hà Nội", "Đà nẵng"
## Ho Chi Minh      Ha Noi     Da Nang 
##           1           2           3
names(v) # Vector nhóm character có 3 giá trị
## [1] "Ho Chi Minh" "Ha Noi"      "Da Nang"

Names

Matrix cũng có tên hàng và tên cột

m <- matrix(1:4,nrow =2, ncol = 2) ; m
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
dimnames(m)
## NULL
dimnames(m) <- list(c("a","b"),             # Tên hàng
                    c("c","d"))             # Tên cột
m
##   c d
## a 1 3
## b 2 4

Names

Tên hàng và tên cột có thể được đặt riêng bằng hàm colnames() và rownames()

colnames(m) <- c('h','f')    # Tên cột
rownames(m) <- c("x","z")    # Tên hàng
m
##   h f
## x 1 3
## z 2 4

Names

Ta cũng đặt tên cho từng thành phần trong List

l <- list(1,2,3); l
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
names(l)
## NULL

Names

l <- list('Ho Chi Minh' = 1, Hanoi = 2, DaNang = 3); l
## $`Ho Chi Minh`
## [1] 1
## 
## $Hanoi
## [1] 2
## 
## $DaNang
## [1] 3
names(l)
## [1] "Ho Chi Minh" "Hanoi"       "DaNang"

Names

Tương tự như vậy cho data frame

df <- data.frame(1:5,
                 seq(1, 10, length = 5),
                 c("a","b","c","d","f"),
                 sample(LETTERS,5,replace = FALSE, prob = NULL))
head(df,2)
##   X1.5 seq.1..10..length...5. c..a....b....c....d....f..
## 1    1                   1.00                          a
## 2    2                   3.25                          b
##   sample.LETTERS..5..replace...FALSE..prob...NULL.
## 1                                                R
## 2                                                P
names(df)
## [1] "X1.5"                                            
## [2] "seq.1..10..length...5."                          
## [3] "c..a....b....c....d....f.."                      
## [4] "sample.LETTERS..5..replace...FALSE..prob...NULL."

Names

colnames(df) <- c("number_1",
                  "number_2",
                  "letter_1",
                  "letter_2") # Tương ứng số cột của df
names(df)
## [1] "number_1" "number_2" "letter_1" "letter_2"
head(df,2)
##   number_1 number_2 letter_1 letter_2
## 1        1     1.00        a        R
## 2        2     3.25        b        P

Tổng kết

Tổng kết

  • Có rất nhiều dạng dữ liệu trong R. Ở phần này chúng ta đã nói về

    • Nhóm cơ bản: Numeric, logical, character, integer, complex
    • Vector, lists
    • Factor
    • Missing values
    • Data frames và Matrix
  • Tất cả R Object đều có attributes để mô tả chúng. Một trong số đó là names, dimension đối với data frame và matrix, và level đối với factor.

Cám ơn mọi người đã chú ý lắng nghe