R语言新一代数据框

tibble函数
tibble是R语言中一个用来替换data.frame类型的扩展的数据框,tibble继承了data.frame,是弱类型的,同时与data.frame有相同的语法,使用起来更方便。tibble包,也是由Hadley开发的R包。
tibble,不关心输入类型,可存储任意类型,包括list类型
tibble,没有行名设置 row.names
tibble,支持任意的列名
tibble,会自动添加列名
tibble,类型只能回收长度为1的输入
tibble,会懒加载参数,并按顺序运行
tibble,是tbl_df类型
创建tibble
library(tidyverse)

head(iris)

as_tibble(iris)

对特殊符号的支持
tb <- tibble(

😃 = “smile”,

= “space”,

2000 = “number”

)

tb

A tibble: 1 x 3
😃 2000
1 smile space number
定制化生成
tribble(

~x, ~y, ~z,

#–|–|----

“a”, 2, 3.6,

“b”, 1, 8.5

)

A tibble: 2 x 3
x y z

1 a 2 3.6

2 b 1 8.5

对比tibble与data.frame
人性化打印。
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
1 2019-07-16 19:27:28 2019-07-31 1 0.906 v
2 2019-07-17 03:46:36 2019-08-12 2 0.271 k
3 2019-07-17 06:38:54 2019-08-10 3 0.0282 x
4 2019-07-16 13:02:51 2019-08-07 4 0.938 v
5 2019-07-17 07:18:28 2019-08-14 5 0.759 t
6 2019-07-16 17:11:20 2019-08-09 6 0.275 f
7 2019-07-16 10:54:57 2019-08-11 7 0.0217 u
8 2019-07-17 03:35:19 2019-07-20 8 0.110 b
9 2019-07-16 14:57:29 2019-07-27 9 0.436 g
10 2019-07-17 05:01:51 2019-08-01 10 0.401 s
… with 990 more rows
nycflights13::flights %>%

print(n = 10, width = Inf)

A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance
1 2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227 1400
2 2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227 1416
3 2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089
4 2013 1 1 544 545 -1 1004 1022 -18 B6 725 N804JB JFK BQN 183 1576
5 2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762
6 2013 1 1 554 558 -4 740 728 12 UA 1696 N39463 EWR ORD 150 719
7 2013 1 1 555 600 -5 913 854 19 B6 507 N516JB EWR FLL 158 1065
8 2013 1 1 557 600 -3 709 723 -14 EV 5708 N829AS LGA IAD 53 229
9 2013 1 1 557 600 -3 838 846 -8 B6 79 N593JB JFK MCO 140 944
10 2013 1 1 558 600 -2 753 745 8 AA 301 N3ALAA LGA ORD 138 733
hour minute time_hour
1 5 15 2013-01-01 05:00:00
2 5 29 2013-01-01 05:00:00
3 5 40 2013-01-01 05:00:00
4 5 45 2013-01-01 05:00:00
5 6 0 2013-01-01 06:00:00
6 5 58 2013-01-01 05:00:00
7 6 0 2013-01-01 06:00:00
8 6 0 2013-01-01 06:00:00
9 6 0 2013-01-01 06:00:00
10 6 0 2013-01-01 06:00:00
… with 3.368e+05 more rows
You can also control the default print behaviour by setting options:
options(tibble.print_max = n, tibble.print_min = m): if more than n rows, print only m rows.
options(tibble.print_min = Inf) to always show all rows.
options(tibble.width = Inf) to always print all columns, regardless of the width of the screen.
取子集。
nycflights13::flights %>%

print(n = 10, width = Inf)

df <- tibble(

x = runif(5),

y = rnorm(5)

)

df
A tibble: 5 x 2
x y
1 0.140 0.492
2 0.0541 -0.307
3 0.366 -0.395
4 0.616 0.441
5 0.203 -2.16
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
class(as.data.frame(tb))

[1] “data.frame”
RStudio官方把tibble项目,集成到了tidyverse项目中了,官方建议直接安装tidyverse项目,这样整个用来做数据科学的库都会被下载下来。
~ R
install.packages(‘tidyverse’)
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ----------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
tidyverse项目,是一个包括了数据科学的一个集合工具项目,用于数据提取,数据清理,数据类型定义,数据处理,数据建模,函数化编程,数据可视化,包括了下面的包。
ggplot2, 数据可视化
dplyr, 数据处理
tidyr, 数据清理
readr, 数据提取
purrr, 函数化编程
tibble, 数据类型定义
tibble包的基本使用
对于tibble包的使用,主要需要掌握创建、数据转型、数据查看、数据操作、与data.frame的区别点。复杂的数据处理功能,是dplyr项目来完成,下一篇讲dplyr的文章再给大家介绍。
3.1 创建tibble
创建一个tibble类型的data.frame是非常简单的,语法与传统的data.frame是类似的。
创建一个tibble类型的data.frame
t1 d1
上面的输出可以看到tibble类型,会在输出时多一行,用来指定每一列的类型。
tibble用缩写定义了7种类型:
int,代表integer
dbl,代表double
chr,代表character向量或字符串。
dttm,代表日期+时间(a date + a time)
lgl,代表逻辑判断TRUE或者FALSE
fctr,代表因子类型factor
date,代表日期dates.
查看类型,发现tbl_df继承了tbl继承是data.frame,所以tibble是data.frame的子类型。
t1为tbl_df类型
class(t1)
[1] “tbl_df” “tbl” “data.frame”
是data.frame类型
class(d1)
[1] "data.frame
判断是不是tibble类型
is.tibble(t1)
[1] TRUE
查看t1的属性
attributes(t1)
$names
[1] “1:10” “b”
$class
[1] “tbl_df” “tbl” “data.frame”
$row.names
[1] 1 2 3 4 5 6 7 8 9 10
查看t1的静态结构
str(t1)
Classes ‘tbl_df’, ‘tbl’ and ‘data.frame’: 10 obs. of 2 variables:
$ 1:10: int 1 2 3 4 5 6 7 8 9 10
$ b : chr “A” “B” “C” “D” …
通过文本排列来创建一个tibble
tribble(

  • ~colA, ~colB,
  • “a”, 1,
  • “b”, 2,
  • “c”, 3
  • )
    A tibble: 3 x 2
    colA colB
    1 a 1
    2 b 2
    3 c 3
    通过vector创建tibble

tibble(letters)
A tibble: 26 x 1
letters
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
… with 16 more rows
通过data.frame创建tibble,这时就会报错了。
tibble(data.frame(1:5))
Error: Column data.frame(1:5) must be a 1d atomic vector or a list
通过list创建tibble
tibble(x = list(diag(1), diag(2)))

A tibble: 2 x 1
x
1
2
我们看到tibble其实是存储list类型,这是data.frame做不到的。
通过一个tibble,创建另一个tibble,这时也会报错了。

tibble(x = tibble(1, 2, 3))
Error: Column x must be a 1d atomic vector or a list
3.2 数据类型转换
tibble是一个新的类型,R语言中大部分的数据都是基于原有的数据类型,所以原有数据类型与tiblle类型的转换就显的非常重要了。
把一个data.frame的类型的转换为tibble类型
定义一个data.frame类型变量
d1 d2 as.data.frame(d2)
X1.5 b
1 1 A
2 2 B
3 3 C
4 4 D
5 5 E
我们可以看到tibble与data.frame的转型是非常平滑的,一个转型函数就够,不需要中间做任何的特殊处理。
把一个vector转型为tibble类型,但是不能再转回vector了。
vector转型到tibble
x as.vector(x)
A tibble: 5 x 1
value
1 1
2 2
3 3
4 4
5 5
把list转型为tibble。
把list转型为tibble
df str(as.list(df))
List of 3
$ x: int [1:500] 1 2 3 4 5 6 7 8 9 10 …
$ y: num [1:500] 0.5914 0.6193 0.0688 0.6958 0.0509 …
$ z: int [1:500] 500 499 498 497 496 495 494 493 492 491 …
tibble与list的转型也是非常平滑的,一个转型函数就够。
把matrix转型为tibble。
生成一个matrix
m df
1 0.8436494 2.1420238 0.2690392 -0.4752708 -0.2334994
2 1.0363340 0.8653771 -0.3200777 -1.7400856 1.2253651
3 -0.2170344 -1.1346455 0.2204718 1.2189431 0.7020156
tibble转为matrix
as.matrix(df)
V1 V2 V3 V4 V5
[1,] 0.8436494 2.1420238 0.2690392 -0.4752708 -0.2334994
[2,] 1.0363340 0.8653771 -0.3200777 -1.7400856 1.2253651
[3,] -0.2170344 -1.1346455 0.2204718 1.2189431 0.7020156
从上面的转型测试可以看到,tibble类型是非常友好的,可以与data.frame, list, matrix 进行相互转型操作。tibble与vector是不能进行直接转型的,这与data.frame的行为是一致的,如果需要转型,我们可以分别取出每一列进行拼接,或转为matrix再操作。
3.3 tibble数据查询
通常我们是str()函数来观察数据的静态组成结果,在tibble包提供了一个glimpse(),可以方便我们来观察tibble和data.frame类型的数据。
glimpse(mtcars)
Observations: 32
Variables: 11
$ mpg 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17…
$ cyl 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, …
$ disp 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6…
$ hp 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215…
$ drat 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0…
$ wt 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440…
$ qsec 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90…
$ vs 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, …
$ am 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, …
$ gear 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, …
$ carb 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, …
打印静态结构
str(mtcars)
‘data.frame’: 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 …
$ cyl : num 6 6 4 6 8 6 8 4 4 6 …
$ disp: num 160 160 108 258 360 …
$ hp : num 110 110 93 110 175 105 245 62 95 123 …
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 …
$ wt : num 2.62 2.88 2.32 3.21 3.44 …
$ qsec: num 16.5 17 18.6 19.4 17 …
$ vs : num 0 0 1 1 0 1 0 1 1 1 …
$ am : num 1 1 1 0 0 0 0 0 0 0 …
$ gear: num 4 4 4 3 3 3 3 4 4 4 …
$ carb: num 4 4 1 1 2 1 4 2 2 4 …
比较glimpse()和str()对于data.frame的数据查看输出
新建tibble
df glimpse(df)
Observations: 500
Variables: 2
$ x -0.3295530, -2.0440424, 0.1444697, 0.8752439, 1.7705952, 0.5898253, 0.1991844,…
$ y “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K”, “L”, “M”, “N”, “O”, “P”…
查看df静态结构
str(df)
Classes ‘tbl_df’, ‘tbl’ and ‘data.frame’: 500 obs. of 2 variables:
$ x: num -0.33 -2.044 0.144 0.875 1.771 …
$ y: chr “A” “B” “C” “D” …
按列出数据,一层[]返回的结果还是tibbe,二层[]与 返回的结果为列组成的向量。 d f d f [ 1 ] A t i b b l e : 3 x 1 x 112233 按列取,返回向量 d f [ [ 1 ] ] [ 1 ] 123 d f 返回的结果为列组成的向量。 df df[1] A tibble: 3 x 1 x 1 1 2 2 3 3 按列取,返回向量 df[[1]] [1] 1 2 3 df 返回的结果为列组成的向量。dfdf[1]Atibble:3x1x112233按列取,返回向量df[[1]][1]123dfx
[1] 1 2 3
按行取数据,这时一定要用,来做分隔符
取第一行
df[1,]
A tibble: 1 x 2
x y
1 1 3
取前2行
df[1:2,]
A tibble: 2 x 2
x y
1 1 3
2 2 2
取第二列的2,3行
df[2:3,2]
A tibble: 2 x 1
y
1 2
2 1
3.4 tibble数据操作
增加一列。
创建一个tibble
df add_column(df, z = -1:1, w = 0)
A tibble: 3 x 4
x y z w
1 1 3 -1 0
2 2 2 0 0
3 3 1 1 0
增加一行,还是基于上面生成的df变量。
在最后,增加一行
add_row(df, x = 99, y = 9)
A tibble: 4 x 2
x y
1 1 3
2 2 2
3 3 1
4 99 9
插入第二行,增加一行
add_row(df, x = 99, y = 9, .before = 2)
A tibble: 4 x 2
x y
1 1 3
2 99 9
3 2 2
4 3 1
3.5 tibble与data.frame的区别
列名,可以自由定义,并且会自动补全。
tb tb
A tibble: 1 x 6
😃 2000 列名 1 1L
1 smile space number hi 1 1
数据,按顺序执行懒加载。
a tibble(a, b = a * 2)
A tibble: 5 x 2
a b
1 1 2
2 2 4
3 3 6
4 4 8
5 5 10
打印输出控制,tibble的打印控制被重写了,所以执行print()函数时,模型会先进行类型匹配,然后调用print.tbl()。
创建tiblle
tb print(tb,n = 10, width = Inf)
A tibble: 5 x 5
a b c d e
1 1 2 NA a a
2 2 4 NA a b
3 3 6 NA a c
4 4 8 NA a d
5 5 10 NA a e
打印前3行,宽度30
print(tb,n = 3, width = 30)
A tibble: 5 x 5
a b c d
1 1 2 NA a
2 2 4 NA a
3 3 6 NA a
… with 2 more rows, and 1
more variables: e
用print函数,打印data.frame
df print(df)
a b c d e
1 1 2 NA a a
2 2 4 NA a b
3 3 6 NA a c
4 4 8 NA a d
5 5 10 NA a e
3.7 特殊的函数
lst,创建一个list,具有tibble特性的list。 lst函数的工作原理,类似于执行[list()],这样的操作。
创建一个list,懒加载,顺序执行
lst(n = 5, x = runif(n))
$n
[1] 5
$x
[1] 0.6417069 0.2674489 0.5610810 0.1771051 0.1504583
enframe,快速创建tibble。enframe提供了一个模板,只有2列name和value,快速地把2个向量匹配的tibble中,可以按行生成或按列生成。
按列生成
enframe(1:3)
A tibble: 3 x 2
name value
1 1 1
2 2 2
3 3 3
按行生成
enframe(c(a = 5, b = 7))
A tibble: 2 x 2
name value
1 a 5
2 b 7
deframe,把tibble反向转成向量,这个函数就实现了,tibble到向量的转换。它默认把name列为索引,用value为值。
生成tibble
df deframe(df)
a b
5 7
3.8 用于处理data.frame函数
tibble还提供了一些用于处理data.frame的函数。
创建data.frame
df has_name(df,‘x’)
[1] TRUE
判断是否有行名
has_rownames(df)
[1] FALSE
给df增加行名
row.names(df) has_rownames(df)
[1] TRUE
去掉行名
remove_rownames(df)
x y
1 1 3
2 2 2
3 3 1
把行名转换为单独的一列
df2 column_to_rownames(df2, var = “rowname”)
x y
A 1 3
B 2 2
C 3 1
把行索引转换为单独的一列
rowid_to_column(df, var = “rowid”)
rowid x y
1 1 1 3
2 2 2 2
3 3 3 1
这些data.frame的工具函数,我猜是用于data.frame到tibble的数据类型转换用的,因为tiblle是没有行名的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值