dplyr包-列选择的方法
专题介绍:R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来。得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器的R Studio(用户的界面体验更好)。也正是由于全世界越来越多的数据科学社区和用户对R包的慷慨贡献,让R语言在全球范围内越来越流行。其中一些R包,例如MASS,SparkR, ggplot2,使数据操作,可视化和计算功能越来越强大。R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。R作为一种统计分析软件,是集统计分析与图形显示于一体的。它可以运行于UNIX、Windows和Macintosh的操作系统上,而且嵌入了一个非常方便实用的帮助系统,相比于其他统计分析软件,R的学术性开发比较早,适合生物学和医学等学术学科的科研人员使用。
【R语言】已开通R语言社群,五湖四海,天南地北,各行各业,有缘相聚,共享R事,雕刻数据,求解问题,以创价值。喜乐入群者,请加微信号luqin360,或扫描文末二维码,添加为好友,同时附上R-入群。有朋自远方来,不亦乐乎,并诚邀入群,以达相互学习和进步之美好心愿。
作为一个R语言学习者,R语言的强大功能,给我的工作带来极大便利。它之所以好用,很大程度上依赖于它有着一批好用的R包。与数据相关的各种动作,都有相应的R包可以支撑。
实际工作中,我们碰到的数据通常是不能直接用于分析和建模的。在这之前,我们需要做数据的整理,以生成可用于后续分析和建模的整洁数据集。dplyr就是一个用于数据整理的R包。
关于数据的整理,它包含了丰富的内容,罗列如下:
-
从列的角度看,有列的选择,列的删除,列的重命名,列的变换,列的增加等
-
从行的角度看,有行的选择,行的增加,行的删除等
-
从数据集整体看,有数据的集成,数据的聚合,数据的子集获取等
上面这些数据操作,dplyr包可以灵活地进行实现。
在本文,记录dplyr包对列做选择的各种方法。
我们以R包自带的数据集为例子,演示用dplyr包进行各种不同需求的列选择,同时,为了让代码更加的精简,文中代码大多数用管道方式来组织。
第一步:加载所需R包和相应数据集
1library(magrittr) # 提供管道操作
2library(dplyr) # 用于数据的整理操作
3library(tidyverse) # 用于使用数据集msleep
我们使用msleep数据集做例子。在进行列的选择之前,我们先查看msleep数据集的结构。
第二步:数据集结构查看
1msleep %>% glimpse() # 使用glimpse函数
这个数据集有83行,11列,有6列是字符型,6列是数值型。
对数据集的结构有个概况后,我们接下来可以实现各种不同需求的列选择操作了。
第三步:列选择的示范
3.1 选择少量感兴趣的列
1msleep %>%
2 select(name, order, awake) %>%
3 glimpse()
3.2 选择连续的列
1msleep %>%
2 select(name:order, awake:bodywt) %>%
3 glimpse()
3.3 列选择的逆向操作,使用-号,删除不要的列,也就实现了所选择的列
1msleep %>%
2 select(-name, -(awake:bodywt)) %>%
3 glimpse()
3.4 基于列名子串做选择
采用了一种包含的逻辑关系,常用函数starts_with(), end_with()和contains()。
1msleep %>%
2 select(starts_with('sleep')) %>%
3 glimpse()
4msleep %>%
5 select(contains('eep')) %>%
6 glimpse()
7msleep %>%
8 select(ends_with('e')) %>%
9 glimpse()
3.5 基于正则表达式选择列
利用正则表达式表示列中某一种模式,以实现列的匹配和选择。
1msleep %>%
2 select(matches("o.+er")) %>%
3 glimpse
这个正则表达式用于匹配包含“o”,后跟一个或多个其他字母和“er”的任何列。
3.6 基于预定义的列清单做列选择
可以使用one_of()函数或者!!操作符。
1classification <- c("name", "genus", "vore")
2
3msleep %>%
4 select(!!classification) %>%
5 glimpse
6
7msleep %>%
8 select(one_of(classification)) %>%
9 glimpse
3.7 基于列的数据类型做列选择
使用select_if()函数结合列的数据类型判断函数is.numeric, is.double, is.character, is.factor, is.logical等。
1msleep %>%
2 select_if(is.character) %>%
3 glimpse
若是需要传递自己定义的函数,需要在前面添加波浪线~,例如,与上面效果等价的写法:
1msleep %>%
2 select_if(~!is.numeric(.)) %>%
3 glimpse
3.8 基于逻辑表达式的列选择
例1,选择数值型列,并且列的均值要大于5
1msleep %>%
2 select_if(is.numeric) %>%
3 select_if(~mean(., na.rm=TRUE) > 5) %>%
4 glimpse()
5
6# 或者
7
8msleep %>%
9 select_if(~is.numeric(1) & mean(., na.rm=TRUE) > 5) %>%
10 glimpse()
例2,选择每个列唯一取值个数大于10的列
1msleep %>%
2 select_if(~n_distinct(.) > 10) %>%
3 glimpse
3.9 列选择的其它用途
例1,用于调换列的顺序
例2,用于列的重命名
例3,对所选择的例批量小写化或者大写化
例4,对列名做清洗
例5,添加行的名称这一列
1# 1) 列的顺序调换
2msleep %>%
3 select(awake, name, everything()) %>%
4 glimpse
5
6# 2) 列的重命名
7msleep %>%
8 select(name1 = name, vore1 = vore, bodywt) %>%
9 glimpse
10# 3) 对所有的列做大写或者小写处理
11msleep %>%
12 select_all(toupper) %>%
13 glimpse()
14# 4) 对选择列的做清洗处理
15msleep2 <- select(msleep, name, sleep_total, brainwt)
16colnames(msleep2) <- c("name", "sleep total", "brain weight")
17
18msleep2 %>%
19 select_all(~str_replace(., " ", "_")) %>%
20 glimpse
21
22msleep2 <- select(msleep, name, sleep_total, brainwt)
23colnames(msleep2) <- c("Q1 name", "Q2 sleep total", "Q3 brain weight")
24msleep2[1:3,]
25msleep2 %>%
26 select_all(~str_replace(., "Q[0-9]+", "")) %>%
27 select_all(~str_replace(., " ", "_"))
28
29# 5) 对行名成添加为一列
30mtcars %>%
31 tibble::rownames_to_column("car_model") %>%
32 head
关于列的选择,你还有那些需求或者场景,请留言。
参考资料:
1https://suzan.rbind.io/2018/01/dplyr-tutorial-1/
2https://dplyr.tidyverse.org/
附录:完整代码
1###################
2#dplyr包
3#列选择的方法
4##################
5# 第一步:加载R包和相应数据集
6library(magrittr) # 提供管道操作
7library(dplyr) # 用于数据的整理操作
8library(tidyverse) # 用于使用数据集msleep
9
10# 第二步:数据集结构查看
11msleep %>% glimpse()
12
13# 第三步:列选择的示范
14# 3.1 选择几个感兴趣的列
15msleep %>%
16 select(name, order, awake) %>%
17 glimpse()
18
19# 3.2 选择连续的列
20msleep %>%
21 select(name:order, awake:bodywt) %>%
22 glimpse()
23
24
25# 3.3 列选择的逆向操作
26msleep %>%
27 select(-name, -(awake:bodywt)) %>%
28 glimpse()
29
30# 3.4 基于列的子串做选择
31msleep %>%
32 select(starts_with('sleep')) %>%
33 glimpse()
34msleep %>%
35 select(contains('eep')) %>%
36 glimpse()
37msleep %>%
38 select(ends_with('e')) %>%
39 glimpse()
40
41# 3.5 基于正则表达式的列的选择
42msleep %>%
43 select(matches("o.+er")) %>%
44 glimpse
45
46# 3.6 基于预定义的列清单做列选择
47classification <- c("name", "genus", "vore")
48
49msleep %>%
50 select(!!classification) %>%
51 glimpse
52
53msleep %>%
54 select(one_of(classification)) %>%
55 glimpse
56
57# 3.7 基于列的数据类型选择列
58msleep %>%
59 select_if(is.character) %>%
60 glimpse
61
62msleep %>%
63 select_if(~!is.numeric(.)) %>%
64 glimpse
65
66# 3.8 基于逻辑表达式的列选择
67msleep %>%
68 select_if(is.numeric) %>%
69 select_if(~mean(., na.rm=TRUE) > 5) %>%
70 glimpse()
71
72# 或者
73
74msleep %>%
75 select_if(~is.numeric(1) & mean(., na.rm=TRUE) > 5) %>%
76 glimpse()
77
78msleep %>%
79 select_if(~n_distinct(.) > 10) %>%
80 glimpse
81
82# 3.9 列选择的其它用途
83# 1) 列的调换顺序
84msleep %>%
85 select(awake, name, everything()) %>%
86 glimpse
87
88# 2) 列的重命名
89msleep %>%
90 select(name1 = name, vore1 = vore, bodywt) %>%
91 glimpse
92# 3) 对所有的列做大写或者小写处理
93msleep %>%
94 select_all(toupper) %>%
95 glimpse()
96# 4) 对选择列的做清洗处理
97msleep2 <- select(msleep, name, sleep_total, brainwt)
98colnames(msleep2) <- c("name", "sleep total", "brain weight")
99
100msleep2 %>%
101 select_all(~str_replace(., " ", "_")) %>%
102 glimpse
103
104msleep2 <- select(msleep, name, sleep_total, brainwt)
105colnames(msleep2) <- c("Q1 name", "Q2 sleep total", "Q3 brain weight")
106msleep2[1:3,]
107msleep2 %>%
108 select_all(~str_replace(., "Q[0-9]+", "")) %>%
109 select_all(~str_replace(., " ", "_"))
110
111# 5) 对行名成添加为一列
112mtcars %>%
113 tibble::rownames_to_column("car_model") %>%
114 head
你在阅读过程中,遇到什么问题,或者有什么心得与收获,可以扫描我的微信号,备注“R-入群”。我会邀请你加入R语言群,和大家一起讨论与学习。
推荐阅读:
1 R语言机器学习3本经典书籍集合本,提高你的R语言和机器学习能力!(可供下载)
2 R语言实战英文书籍,配套源代码,帮助你学习R语言!(可下载)
推荐公众号:数据科学与人工智能
数据科学与人工智能公众号推广Python语言,数据科学与人工智能的知识和信息。扫码下方二维码关注我,一起学习Python语言和数据科学与人工智能。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!