library(dplyr)
library(knitr)
$set(
opts_chunkmessage = FALSE
)
<- data.frame(
d a = c(1, 0, 1, 0, 0),
b = seq(5)
)
d
a b
1 1 1
2 0 2
3 1 3
4 0 4
5 0 5
library(dplyr)
library(knitr)
$set(
opts_chunkmessage = FALSE
)
<- data.frame(
d a = c(1, 0, 1, 0, 0),
b = seq(5)
)
d
a b
1 1 1
2 0 2
3 1 3
4 0 4
5 0 5
Trong khi data frame có tên hàng, tibble không có.
rownames(d) <- c("a", "b", "c", "d", "e")
d
a b
a 1 1
b 0 2
c 1 3
d 0 4
e 0 5
<- tibble(d)
d_tib d_tib
# A tibble: 5 × 2
a b
<dbl> <int>
1 1 1
2 0 2
3 1 3
4 0 4
5 0 5
Muốn thêm tên hàng cho tibble, chúng ta tạo một cột mới.
<- tibble(tibble::rownames_to_column(d, "id"))
d_tib d_tib
# A tibble: 5 × 3
id a b
<chr> <dbl> <int>
1 a 1 1
2 b 0 2
3 c 1 3
4 d 0 4
5 e 0 5
Cũng vì lí do này, data frame có thể slice theo tên hàng, còn tibble thì không.
c("a", "b"), ] d[
a b
a 1 1
b 0 2
%>% filter(id %in% c("a", "b")) d_tib
# A tibble: 2 × 3
id a b
<chr> <dbl> <int>
1 a 1 1
2 b 0 2
Để truy cập vào dữ liệu của một cột trong data frame, chúng ta có những cách sau.
$a d
[1] 1 0 1 0 0
"a"] d[,
[1] 1 0 1 0 0
c("a")] d[,
[1] 1 0 1 0 0
Những cách này trả về vector nếu chỉ slice một cột. Muốn giữ nguyên định dạng data frame (gọi là subset), chúng ta làm như sau.
"a"] d[
a
a 1
b 0
c 1
d 0
e 0
Thêm một cặp ngoặc vuông nữa, bạn cũng sẽ lấy được vector giá trị của cột.
"a"]] d[[
[1] 1 0 1 0 0
Slicing bằng giá trị chuỗi kí tự của tên cột thuận lợi cho lập trình.
<- "a"
col_name d[[col_name]]
[1] 1 0 1 0 0
Đối với tibble, slicing luôn trả về subset.
"a"] d_tib[
# A tibble: 5 × 1
a
<dbl>
1 1
2 0
3 1
4 0
5 0
"a"] d_tib[,
# A tibble: 5 × 1
a
<dbl>
1 1
2 0
3 1
4 0
5 0
c("a")] d_tib[,
# A tibble: 5 × 1
a
<dbl>
1 1
2 0
3 1
4 0
5 0
Để lấy vector, bạn có thể dùng các cách sau.
$a d_tib
[1] 1 0 1 0 0
"a"]] d_tib[[
[1] 1 0 1 0 0
%>% pull(a) d_tib
[1] 1 0 1 0 0
Do vậy, muốn lập trình với tibble, bạn có thể làm như sau.
d_tib[[col_name]]
[1] 1 0 1 0 0
Hoặc
%>% pull(!!rlang::sym(col_name)) d_tib
[1] 1 0 1 0 0
Tương tự, nếu muốn subset, bạn có thể làm như trên với hàm select()
.
%>% select(!!rlang::sym(col_name)) d_tib
# A tibble: 5 × 1
a
<dbl>
1 1
2 0
3 1
4 0
5 0