- List
- Factor
- Missing data
- Data Frame
- Names
19/08/2020
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.
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"
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
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")
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
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
model_info <- summary(model)
View(model_info)
# 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ố.
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
Ở 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"
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
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ấ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"
# 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"
# 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 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 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
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.
v <- 1:3 v # Vector nhóm numeric, có ba giá trị 1,2,3
## [1] 1 2 3
names(v)
## NULL
# 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"
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
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
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
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"
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."
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
Có rất nhiều dạng dữ liệu trong R. Ở phần này chúng ta đã nói về
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.