【上一篇:28.关于tibble和data.frame之一】
【下一篇:30.关于readr包里的read系列函数】
3. tibble()函数和data.frame()函数的不同之二
1) 在print上的不同。传统的数据框,print之后展示所有的行和列,tibble的print只展示前十行,列会适应屏幕展示。
> nycflights13::flights %>% print()
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
<int> <int> <int> <int> <int> <dbl> <int> <int>
1 2013 1 1 517 515 2 830 819
2 2013 1 1 533 529 4 850 830
3 2013 1 1 542 540 2 923 850
4 2013 1 1 544 545 -1 1004 1022
5 2013 1 1 554 600 -6 812 837
6 2013 1 1 554 558 -4 740 728
7 2013 1 1 555 600 -5 913 854
8 2013 1 1 557 600 -3 709 723
9 2013 1 1 557 600 -3 838 846
10 2013 1 1 558 600 -2 753 745
# ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
# carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
# air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
# time_hour <dttm>
可设置print的参数控制打印:
# 打印20行,列全部打印
nycflights13::flights %>% print(n = 20, width = Inf)
对tibble,可以用options()函数进行全局打印设置(一经设置,永久有效):
#设置最小打印行数和最大打印行数,如果tibble有>n行,则只打印m行
options(tibble.print_max = n, tibble.print_min = m)
#设置打印所有行
options(tibble.print_min = Inf)
#打印所有的列
options(tibble.width = Inf)
2) 取列的子集的两个新工具$和[[。tibble取子集对变量名较严格。
$后直接跟变量名
[[数字或者变量名]] #变量名要用双引号括起来
取子集的不同
data.frame取一列不返回向量的方法:
> df<-data.frame(a=1:10,b=letters[1:10],c=runif(10))
> df[1]
a
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
> df[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> df[,1]
[1] 1 2 3 4 5 6 7 8 9 10
4. 其他小知识
1) 假设将变量名存到一个对象中,如何用这个对象把变量的值从tibble中取出来。
> var<-'a'
> df<-tibble(a=1:10,b=letters[1:10],c=runif(10))
> df[[var]]
[1] 1 2 3 4 5 6 7 8 9 10
> df[["a"]]
[1] 1 2 3 4 5 6 7 8 9 10
2) 一种特殊的占位符" . "可以在pip中使用:
df %>% .[[var]]
df %>% .$a
3) tibble.enframe()函数可以将向量转成tibble,其他更多功能见帮助文档。
enframe(1:3)
4) 解引用表达式
> x <- 3
> tibble(x = 1, y = x)
# A tibble: 1 x 2
x y
<dbl> <dbl>
1 1 1
> tibble(x = 1, y = !!x)
# A tibble: 1 x 2
x y
<dbl> <dbl>
1 1 3
4. 很重要的总结
1. 对tibble中的列名(也就是变量名),能用non-syntactic name,其实就是用``将name括起来了,没啥大不了的。但要注意的是,使用的时候,不管是取子集、运算、绘图,都要用``括起来后才能正常使用。data.frame中跟列名有关的参数是:
stringsAsFactors:逻辑值,默认为FALSE,是否将字符串向量转成因子
check.names:逻辑值,默认TRUE,检查列名确认其符合syntactic,且是unique的。
> (df<-data.frame(1:10,letters[1:10],runif(10),check.names = T))
X1.10 letters.1.10. runif.10.
1 1 a 0.81224026
2 2 b 0.07225875
3 3 c 0.64121344
4 4 d 0.71966993
5 5 e 0.36557231
6 6 f 0.85513545
7 7 g 0.45942457
8 8 h 0.15722427
9 9 i 0.41453395
10 10 j 0.90570964
> (df<-data.frame(1:10,letters[1:10],runif(10),check.names = F,fix.empty.names = F))
1 1 a 0.39641492
2 2 b 0.39382357
3 3 c 0.05149723
4 4 d 0.94000301
5 5 e 0.59156748
6 6 f 0.60415162
7 7 g 0.79627461
8 8 h 0.37756130
9 9 i 0.35011473
10 10 j 0.78170703
fix.empty.names:逻辑值,默认为TRUE,表示如果构建数据框的时候形式是value
(不是tag=value),就给个constructed name;如果是FLASE,就给空。此时check.names应该为FALSE
> (df<-data.frame(1:10,letters[1:10],runif(10),check.names = F))
1:10 letters[1:10] runif(10)
1 1 a 0.394257475
2 2 b 0.620495489
3 3 c 0.330593479
4 4 d 0.001414736
5 5 e 0.585622990
6 6 f 0.732553757
7 7 g 0.612864199
8 8 h 0.690226531
9 9 i 0.055589493
10 10 j 0.997872859
2. 对行名,tibble的行名不可变,data.frame的可以用rawnames()函数设置。data.frame()函数中与行名有关的参数是:
row.names:默认为NULL,也就是不指定行名,指定的方法上一篇说过了
check.rows:逻辑值,默认为FALSE,检查行长度和名称的一致性 #此参数,费解
3. 最重要的一点,看完每个函数的Usage,决定前面的理解并不正确。但,第一遍学习,常学常新!!!
4.记住主要参数,细节需要的时候再深究。
很高兴遇见这本书,打通了之前的很多关卡。学得很难,但会坚持。
部分理解可能不对,欢迎指正!
网友评论