【r<-数据整理】tibbles

library('tidyverse')

创建 tibbles

如果你想要将R的data.frame强制转换为tibble,可以使用 as_tibble():

as_tibble(iris)
#> # A tibble: 150 x 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
#> 1          5.1         3.5          1.4         0.2 setosa 
#> 2          4.9         3            1.4         0.2 setosa 
#> 3          4.7         3.2          1.3         0.2 setosa 
#> 4          4.6         3.1          1.5         0.2 setosa 
#> 5          5           3.6          1.4         0.2 setosa 
#> 6          5.4         3.9          1.7         0.4 setosa 
#> # ... with 144 more rows

你也可以使用tibble()从单个的向量创建一个新的tibble(),它会自动进行循环对齐。

tibble(
  x = 1:5, 
  y = 1, 
  z = x ^ 2 + y
)
#> # A tibble: 5 x 3
#>       x     y     z
#>   <int> <dbl> <dbl>
#> 1     1     1     2
#> 2     2     1     5
#> 3     3     1    10
#> 4     4     1    17
#> 5     5     1    26

如果你对data.frame()熟悉,会注意到tibble()做的事情更少——这更加符合我们的需要:它从不改变输入数据的类型(例如它不会将字符转换为因子),它也不会改变变量名,并且它不会创建行名。

tibble的列名可能不是合法的R变量名,称为 non-syntactic。我们在使用时需要用到反引号```:

tb <- tibble(
  `:)` = "smile", 
  ` ` = "space",
  `2000` = "number"
)
tb
#> # A tibble: 1 x 3
#>   `:)`  ` `   `2000`
#>   <chr> <chr> <chr> 
#> 1 smile space number

另一种创建tibble的方式是使用tribble()tr是转换的缩写,该函数用于自定义代码中的数据输入,列名用公式定义,条目用逗号分隔。这让列出少量的数据并被容易读入变得可能。

tribble(
  ~x, ~y, ~z,
  #--|--|----
  "a", 2, 3.6,
  "b", 1, 8.5
)
#> # A tibble: 2 x 3
#>   x         y     z
#>   <chr> <dbl> <dbl>
#> 1 a         2   3.6
#> 2 b         1   8.5

我通常添加一个注释符号,让信息头变得更清楚。

10.3 Tibbles vs. data.frame

tibble vs. 经典的data.frame存在两处不同:打印和取子集。

10.3.1 打印

Tibbles默认只打印数据的前10行,而且所有的列都会适应屏幕,处理大数据时这将变得更加轻松。除了列名,每一列的数据类型也会打印。

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)
)
#> # A tibble: 1,000 x 5
#>   a                   b              c     d e    
#>   <dttm>              <date>     <int> <dbl> <chr>
#> 1 2018-06-21 05:08:33 2018-06-28     1 0.368 h    
#> 2 2018-06-21 23:13:43 2018-07-03     2 0.612 n    
#> 3 2018-06-21 17:37:22 2018-07-13     3 0.415 l    
#> 4 2018-06-21 06:58:39 2018-07-12     4 0.212 x    
#> 5 2018-06-21 03:22:56 2018-07-09     5 0.733 a    
#> 6 2018-06-21 14:23:53 2018-07-05     6 0.460 v    
#> # ... with 994 more rows

有时候你可能需要自定义打印行与列,有以下方式

你可以使用print()指定数据框,用n控制行,用width控制列:

nycflights13::flights %>% 
  print(n = 10, width = Inf)

你也可以设置选项以更改默认的打印行为:

  • options(tibble.print_max = n, tibble.print_min = m): 如果大于n行,仅打印m行。使用 options(tibble.print_min = Inf)总是显示所有行。
  • 使用 options(tibble.width = Inf) 总是输出所有列,不管屏幕宽度。

你可以使用 package?tibble查看所有的选项列表。

最后的选项是使用RStudio内置的数据查看器,然后滚动查看数据集内容,可以把它用在操作链的末尾:

nycflights13::flights %>% 
  View()

10.3.2 取子集

如果你想要取出特定列,我们使用 $ and [[[[根据名字或位置;$仅根据名字。

df <- tibble(
  x = runif(5),
  y = rnorm(5)
)

# Extract by name
df$x
#> [1] 0.434 0.395 0.548 0.762 0.254
df[["x"]]
#> [1] 0.434 0.395 0.548 0.762 0.254

# Extract by position
df[[1]]
#> [1] 0.434 0.395 0.548 0.762 0.254

想要把上述用于管道,需要使用占位符.:

df %>% .$x
#> [1] 0.434 0.395 0.548 0.762 0.254
df %>% .[["x"]]
#> [1] 0.434 0.395 0.548 0.762 0.254

相比于data.frame,tibbles更加严格:它从不执行部分匹配,并且在你想要获取不存在列时回抛出警告。

与旧代码交互

一些旧函数不能使用tibbles,这时候你可以使用as.data.frame()将tibble转换回数据框:

class(as.data.frame(tb))
#> [1] "data.frame"

from <R for data science>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容