ITPub博客

首页 > > > 为什么你要使用tidyfst的select_dt

为什么你要使用tidyfst的select_dt

作者:浪花小雨滴 时间:2020-03-15 07:16:09 0 删除 编辑

作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(R),致力于利用数据科学迅速积累行业经验优势和科学知识发现,涉猎内容包括但不限于信息计量、机器学习、数据可视化、应用统计建模、知识图谱等,著有《R语言数据高效处理指南》(《R语言数据高效处理指南》(黄天元)【摘要 书评 试读】- 京东图书,《R语言数据高效处理指南》(黄天元)【简介_书评_在线阅读】 - 当当图书)。知乎专栏:R语言数据挖掘。邮箱:huang.tian-yuan@qq.com.欢迎合作交流。

数据框是R语言中最基本的数据结构,而选择你需要的列,是一个使用频次非常高的任务。为了解决这个简单而不简约的问题,在tidyfst的0.8.8版本中,推出了select_dt函数,让你随心所欲地选择任意你想选择的列。

我们就以iris数据集为例,首先应该支持的就是直接用列名称选择。

library(tidyfst)
## 
## Life's short, use R.
# 选择单列
iris %>% select_dt(Sepal.Length)
##      Sepal.Length
##             <num>
##   1:          5.1
##   2:          4.9
##   3:          4.7
##   4:          4.6
##   5:          5.0
##  ---             
## 146:          6.7
## 147:          6.3
## 148:          6.5
## 149:          6.2
## 150:          5.9
# 选择多列
iris %>% select_dt(Sepal.Length,Sepal.Width)
##      Sepal.Length Sepal.Width
##             <num>       <num>
##   1:          5.1         3.5
##   2:          4.9         3.0
##   3:          4.7         3.2
##   4:          4.6         3.1
##   5:          5.0         3.6
##  ---                         
## 146:          6.7         3.0
## 147:          6.3         2.5
## 148:          6.5         3.0
## 149:          6.2         3.4
## 150:          5.9         3.0

尽管如此,如果列特别多的时候,利用正则就很有用。而select_dt在接受一个字符型的时候,就会识别为正则表达式,这就意味着你可以:

iris %>% select_dt("^Se")
##      Sepal.Length Sepal.Width
##             <num>       <num>
##   1:          5.1         3.5
##   2:          4.9         3.0
##   3:          4.7         3.2
##   4:          4.6         3.1
##   5:          5.0         3.6
##  ---                         
## 146:          6.7         3.0
## 147:          6.3         2.5
## 148:          6.5         3.0
## 149:          6.2         3.4
## 150:          5.9         3.0
iris %>% select_dt("Length$")
##      Sepal.Length Petal.Length
##             <num>        <num>
##   1:          5.1          1.4
##   2:          4.9          1.4
##   3:          4.7          1.3
##   4:          4.6          1.5
##   5:          5.0          1.4
##  ---                          
## 146:          6.7          5.2
## 147:          6.3          5.0
## 148:          6.5          5.2
## 149:          6.2          5.4
## 150:          5.9          5.1
iris %>% select_dt("Se|Pe")
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
##             <num>       <num>        <num>       <num>
##   1:          5.1         3.5          1.4         0.2
##   2:          4.9         3.0          1.4         0.2
##   3:          4.7         3.2          1.3         0.2
##   4:          4.6         3.1          1.5         0.2
##   5:          5.0         3.6          1.4         0.2
##  ---                                                  
## 146:          6.7         3.0          5.2         2.3
## 147:          6.3         2.5          5.0         1.9
## 148:          6.5         3.0          5.2         2.0
## 149:          6.2         3.4          5.4         2.3
## 150:          5.9         3.0          5.1         1.8

如果你想选择的,恰恰是正则的补集,而其补集不好写正则,怎么办?没关系,直接加减号即可:

iris %>% select_dt(-"^Se")
##      Petal.Length Petal.Width   Species
##             <num>       <num>    <fctr>
##   1:          1.4         0.2    setosa
##   2:          1.4         0.2    setosa
##   3:          1.3         0.2    setosa
##   4:          1.5         0.2    setosa
##   5:          1.4         0.2    setosa
##  ---                                   
## 146:          5.2         2.3 virginica
## 147:          5.0         1.9 virginica
## 148:          5.2         2.0 virginica
## 149:          5.4         2.3 virginica
## 150:          5.1         1.8 virginica
# 也可以加感叹号,就是:
# iris %>% select_dt(!"^Se")

还有一种“A:C”的写法,tidyfst同样支持:

iris %>% select_mix(Sepal.Length:Petal.Length)
#>      Sepal.Length Sepal.Width Petal.Length
#>             <num>       <num>        <num>
#>   1:          5.1         3.5          1.4
#>   2:          4.9         3.0          1.4
#>   3:          4.7         3.2          1.3
#>   4:          4.6         3.1          1.5
#>   5:          5.0         3.6          1.4
#>  ---                                      
#> 146:          6.7         3.0          5.2
#> 147:          6.3         2.5          5.0
#> 148:          6.5         3.0          5.2
#> 149:          6.2         3.4          5.4
#> 150:          5.9         3.0          5.1

如果你把行名称放在一个变量中,那么要注意,为了避免歧义(列名称与存储变量对象名称一致的现象),这里需要用select_dt函数,并使用cols参数。

iris %>% select_dt(cols = names(iris)[3])
##      Petal.Length
##             <num>
##   1:          1.4
##   2:          1.4
##   3:          1.3
##   4:          1.5
##   5:          1.4
##  ---             
## 146:          5.2
## 147:          5.0
## 148:          5.2
## 149:          5.4
## 150:          5.1

没错,在tidyfst中选择列就是可以为所欲为。当然,最传统的利用列所在位置的选择方法,在tidyfst中也毫无问题:

iris %>% select_dt(1:3)
##      Sepal.Length Sepal.Width Petal.Length
##             <num>       <num>        <num>
##   1:          5.1         3.5          1.4
##   2:          4.9         3.0          1.4
##   3:          4.7         3.2          1.3
##   4:          4.6         3.1          1.5
##   5:          5.0         3.6          1.4
##  ---                                      
## 146:          6.7         3.0          5.2
## 147:          6.3         2.5          5.0
## 148:          6.5         3.0          5.2
## 149:          6.2         3.4          5.4
## 150:          5.9         3.0          5.1
iris %>% select_dt(1,3)
##      Sepal.Length Petal.Length
##             <num>        <num>
##   1:          5.1          1.4
##   2:          4.9          1.4
##   3:          4.7          1.3
##   4:          4.6          1.5
##   5:          5.0          1.4
##  ---                          
## 146:          6.7          5.2
## 147:          6.3          5.0
## 148:          6.5          5.2
## 149:          6.2          5.4
## 150:          5.9          5.1

一言不合不想要,就可以加负号来排除它们:

iris %>% select_dt(-(1:3))
##      Petal.Width   Species
##            <num>    <fctr>
##   1:         0.2    setosa
##   2:         0.2    setosa
##   3:         0.2    setosa
##   4:         0.2    setosa
##   5:         0.2    setosa
##  ---                      
## 146:         2.3 virginica
## 147:         1.9 virginica
## 148:         2.0 virginica
## 149:         2.3 virginica
## 150:         1.8 virginica
iris %>% select_dt(-1,-3)
##      Sepal.Width Petal.Width   Species
##            <num>       <num>    <fctr>
##   1:         3.5         0.2    setosa
##   2:         3.0         0.2    setosa
##   3:         3.2         0.2    setosa
##   4:         3.1         0.2    setosa
##   5:         3.6         0.2    setosa
##  ---                                  
## 146:         3.0         2.3 virginica
## 147:         2.5         1.9 virginica
## 148:         3.0         2.0 virginica
## 149:         3.4         2.3 virginica
## 150:         3.0         1.8 virginica

除此以外,还能够根据列的类型来选择列:

# 只选择因子变量
iris %>% select_dt(is.factor)
##        Species
##         <fctr>
##   1:    setosa
##   2:    setosa
##   3:    setosa
##   4:    setosa
##   5:    setosa
##  ---          
## 146: virginica
## 147: virginica
## 148: virginica
## 149: virginica
## 150: virginica

同时,负号可以让它再见:

iris %>% select_dt(-is.factor)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
##             <num>       <num>        <num>       <num>
##   1:          5.1         3.5          1.4         0.2
##   2:          4.9         3.0          1.4         0.2
##   3:          4.7         3.2          1.3         0.2
##   4:          4.6         3.1          1.5         0.2
##   5:          5.0         3.6          1.4         0.2
##  ---                                                  
## 146:          6.7         3.0          5.2         2.3
## 147:          6.3         2.5          5.0         1.9
## 148:          6.5         3.0          5.2         2.0
## 149:          6.2         3.4          5.4         2.3
## 150:          5.9         3.0          5.1         1.8

这还不算完,如果我都想要怎么办?比如,我想要1到3列的变量和因子变量,因子变量放在前面。对于这个任务,tidyfst推出超级选择函数select_mix:

iris %>% select_mix(is.factor,1:3)
##        Species Sepal.Length Sepal.Width Petal.Length
##         <fctr>        <num>       <num>        <num>
##   1:    setosa          5.1         3.5          1.4
##   2:    setosa          4.9         3.0          1.4
##   3:    setosa          4.7         3.2          1.3
##   4:    setosa          4.6         3.1          1.5
##   5:    setosa          5.0         3.6          1.4
##  ---                                                
## 146: virginica          6.7         3.0          5.2
## 147: virginica          6.3         2.5          5.0
## 148: virginica          6.5         3.0          5.2
## 149: virginica          6.2         3.4          5.4
## 150: virginica          5.9         3.0          5.1

对于个性化选择数据框的列,你想要的都在这里。

温馨提示:tidyfst的函数能够处理所有数据框,最后输出一个data.table。

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39957