library(tidyverse)
#多數(shù)其他 R 包使用的是標準數(shù)據(jù)框
#使用 as_tibble() 函數(shù)來完成將數(shù)據(jù)框轉(zhuǎn)換為 tibble:
as_tibble(iris)
#可以通過 tibble() 函數(shù)使用一個向量來創(chuàng)建新 tibble剔难。
#tibble() 會自動重復長度為 1 的輸入恭应,并可以使用剛剛創(chuàng)建的新變量
tibble(
? x = 1:5,
? y = 1,
? z=x^2+ y )
#如果你已經(jīng)非常熟悉 data.frame() 函數(shù)鞭衩,
#那么請注意 tibble() 函數(shù)的功能要少得多:
#它不能改變輸入的類型(例如扒磁,不能將字符串轉(zhuǎn)換為因子)歼捏、變量的名稱磺芭,也不能創(chuàng)建行名稱枫虏。
#可以在 tibble 中使用在 R 中無效的變量名稱(即不符合語法的名稱)作為列名稱盾鳞。
#例如懒鉴, 列名稱可以不以字母開頭诡挂,也可以包含特殊字符(如空格)。
#要想引用這樣的變量临谱,需要 使用反引號 ` 將它們括起來:
tb <- tibble(
? `:)` = "smile",
? ` ` = "space",
? `2000` = "number"
)
tb
#如果要在 ggplot2 和 dplyr 等其他 R 包中使用這些變量璃俗,也需要使用反引號。
#創(chuàng)建 tibble 的另一種方法是使用 tribble() 函數(shù)悉默,
#tribble 是 transposed tibble(轉(zhuǎn)置 tibble) 的縮寫城豁。
#tribble() 是定制化的,可以對數(shù)據(jù)按行進行編碼:
#列標題由公式(以 ~ 開頭) 定義抄课,數(shù)據(jù)條目以逗號分隔钮蛛,這樣就可以用易讀的方式對少量數(shù)據(jù)進行布局:
#我通常會加一條注釋(以 # 開頭的行)來明確指出標題行的位置。
tribble(
? ~x, ~y, ~z,
? #--|--|----
? "a", 2, 3.6,
? "b", 1, 8.5
)
#對比tibble與data.frame
#tibble 和傳統(tǒng) data.frame 的使用方法主要有兩處不同:打印和取子集剖膳。
#打印
#tibble 的打印方法進行了優(yōu)化魏颓,只顯示前 10 行結(jié)果,
#并且列也是適合屏幕的吱晒,這種方式非常適合大數(shù)據(jù)集甸饱。
#除了打印列名,tibble 還會打印出列的類型仑濒,這項非常棒的功能借鑒于 str() 函數(shù)叹话。
tibble(
? a = lubridate::now() + runif(1e3) * 86400, b = lubridate::today() + runif(1e3) * 30, c = 1:1e3,
? d = runif(1e3),
? e = sample(letters, 1e3, replace = TRUE)
)
#有時需要比默認顯 示更多的輸出,這時就要設置幾個選項墩瞳。
#可以明確使用 print() 函數(shù)來打印數(shù)據(jù)框驼壶,并控制打印的行數(shù)(n)和顯示的寬度 (width)。
#width = Inf 可以顯示出所有列
nycflights13::flights %>%
? print(n = 10, width = Inf)
#還可以通過設置以下選項來控制默認的打印方式喉酌。
#? options(tibble.print_max = n, tibble.pring_min = m):如果多于 m 行热凹,則只打印出 n 行。
#? options(tibble.print_min = Inf) 表示總是打印所有行泪电。
#? options(tibble.width = Inf) 表示總是打印所有列般妙,不考慮屏幕的寬度。
#最后一種方式是使用 RStudio 內(nèi)置的數(shù)據(jù)查看器相速,以滾動方式查看整個數(shù)據(jù)集碟渺。
nycflights13::flights %>%
? View()
#取子集
#如果想要提取單個變量,那么就需 要一些新工具突诬,如 $ 和 [[苫拍。
#[[ 可以按名稱或位置提取變量;
#$ 只能按名稱提取變量芜繁,但可以減少一些輸入:
#runif()函數(shù)用于生成從0到1區(qū)間范圍內(nèi)的服從正態(tài)分布的隨機數(shù)
#rnorm()函數(shù)產(chǎn)生一系列服從正態(tài)分布的隨機數(shù),隨機數(shù)個數(shù)绒极,均值和標準差都可以設定骏令。
df <- tibble(
? x = runif(5),
? y = rnorm(5)
)
# 按名稱提取
df$x
df[["x"]]
# 按位置提取
df[[1]]
#在管道中使用這些提取操作,需要使用特殊的占位符 .
df %>% .$x
df %>% .[["x"]]
#與 data.frame 相比集峦,tibble 更嚴格:
#它不能進行部分匹配伏社,如果想要訪問的列不存在抠刺,它會生成一條警告信息塔淤。
#與舊代碼進行交互
#有些比較舊的函數(shù)不支持 tibble。
#如果遇到這種函數(shù)速妖,可以使用 as.data.frame() 函數(shù)將tibble 轉(zhuǎn)換回 data.frame:
class(as.data.frame(tb))
#有些舊函數(shù)不支持 tibble 的主要原因在于 [ 的功能高蜂。
#對于 R 基礎包中的數(shù)據(jù)框,[ 有時返回一個數(shù)據(jù)框罕容, 有時返回一個向量备恤。
#對于 tibble,[ 則總是返回另一個 tibble锦秒。