首页 > > > 为什么你要使用tidyfst的select_dt
作者:黄天元,复旦大学博士在读,热爱数据科学与开源工具(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。
原文作者:;如有侵权,请联系管理员删除。