R学习 从Tidyverse学起,入门R语言(tibble,readr和dplyr)
R学习往期回顾:
tidyverse出自于R大神Hadley Wickham之手,他是Rstudio首席科学家,也是ggplot2的作者。tidyverse就是他将自己所写的包整理成了一整套数据处理的方法,包括ggplot2,dplyr,tidyr,readr,purrr,tibble,stringr, forcats。同时也出了一本《R for Data Science》,这本书里面也详细介绍了tidyverse的使用方法。
tidyverse包含日常处理数据使用的核心包
我们可以将这些包进行分类:数据导入、数据整理、数据转换、可视化、建模、编程。
今天主要学习tibble,readr和dplyr
install.packages("tidyverse")
library(tidyverse)
tibble函数用法
R中的对多变量数据的标准保存形式是dataframe,而tibble是dataframe的进化版,它有如下优点:1.生成的数据框数据每列可以保持原来的数据格式,不会被强制性改变,即字符串,不会莫名其妙的变成因子格式;2.查看数据时,不再会一行显示不下,多行显示得非常丑;3.数据操作速度会更快
创建tibble
将数据框转换为 tibble。可以使用 as_tibble() 函数来完成转换
as_tibble(iris)
可以通过 tibble() 函数使用一个向量来创建新 tibble。tibble() 会自动重复长度为 1 的输入,并可以使用刚刚创建的新变量
tibble(
x = 1:5,
y = 1,
z = x ^ 2 + y
)
tibble() 函数的功能要比data.frame少得多:它不能改变输入的类型(例如,不能将字符串转换为因子)、变量的名称,也不能创建行名称。
对比tibble与data.frame
tibble 和传统 data.frame 的使用方法主要有两处不同:
打印和取子集
打印
tibble 的打印方法进行了优化,只显示前 10 行结果,并且列也是适合屏幕的,这种方式非常适合大数据集。除了打印列名, tibble 还会打印出列的类型,这项非常棒的功能借鉴于str() 函数
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)
)
取子集
迄今为止,你学到的所有工具都是作用于整个数据框。如果想要提取单个变量,那么就需要一些新工具,如 $ 和 [[。[[ 可以按名称或位置提取变量;$ 只能按名称提取变量,但可以减少一些输入:
df <- tibble(
x = runif(5),
y = rnorm(5)
)
df
按名称提取
df$x
按位置提取
df[[1]]
要想在管道中使用这些提取操作,需要使用特殊的占位符
df %>% .$x
df %>% .[["x"]]
与 data.frame 相比, tibble 更严格:它不能进行部分匹配,如果想要访问的列不存在,它会生成一条警告信息.
readr函数用法
readr的目标是提供一种快速、友好的方法来读取矩形数据(如csv、tsv和fwf)。它的设计目的是灵活地解析许多类型的数据。
readr包的功能有
1 readr:read_csv(); read_tsv(); read_delim(); read_fwf(); read_table();
2 read_log();
3 readxl:read_xls(); read_xlsx();
4 haven:打开SAS 、SPSS、Stata等外部数据
dplyr函数用法
dplyr基本包含了我们整理数据的所有功能
1 mutate()使用现有变量的函数创建新变量
2 select()根据变量的名称选择变量
3 filter()根据条件过滤数据
4 summary()概述数据的统计特征
5 arrange()根据某一列的数据对行排序
5 group_by()对数据分组
mutate函数用法
starwars
增加一列
starwars %>%
mutate(bmi = mass / ((height / 100) ^ 2))
如果只想保留新的列,可以使用 transmute() 函数
starwars %>%
transmute(bmi = mass / ((height / 100) ^ 2))
删除name这一列
starwars %>%
mutate(name =NULL)
select函数用法
选择一些列,不保留其余的列
starwars %>%
select(name,height,hair_color)
我们还可以在 select () 函数中使用一些辅助函数。· startswith("abc"):匹配以“abc”开头的名称。· endswith("xyz"):匹配以“xyz”结尾的名称。· contains("ijk"):匹配包含“ijk”的名称。· matches("(.)\1"):选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有重复字符的变量。· num_range("x", 1:3):匹配 x1、 x2 和 x3。
以某一特征选择列
starwars %>%
select(name,ends_with("color"))
把某些列提到前面
starwars %>%
select(name,starships,everything())
将某一列移到最后
starwars %>%
select(-name,name)
删除一列
starwars %>%
select(-name)
重命名列
只保留重命名的列
starwars %>%
select(NAME = name )#被改名的列放在=的右边
保留其余列:用rename函数
starwars %>%
rename(NAME = name )
根据列名的特征筛选列并重命名
starwars %>%
select(hahaha = ends_with('color'))
filter函数用法
根据某一列的特征筛选行
starwars %>%
filter(species == "Human")
starwars %>%
filter(mass > 100)
多重筛选
和(&)与“,”效果一致
starwars %>%
filter(hair_color == "none" & eye_color == "black")
starwars %>%
filter(starwars, hair_color == "none", eye_color == "black")
或(|)
starwars %>%
filter( hair_color == "none" | eye_color == "black")%>%
select(hair_color,eye_color,everything())
group_by和summarise函数用法
group_by() 可以将分析单位从整个数据集更改为单个分组。接下来,在分组后的数据框上使用 dplyr 函数时,它们会自动地应用到每个分组。
group_by并不改变数据的模样
by_cyl<-mtcars %>% group_by(cyl)
by_cyl
对每一组进行描述
by_cyl %>% summarise(
disp = mean(disp),
hp = mean(hp)
)
而没有分组的,则对所有数据进行描述
mtcars %>% summarise(
disp = mean(disp),
hp = mean(hp)
)
使用ungroup去除分组
by_cyl %>%
ungroup()%>%
summarise(
disp = mean(disp),
hp = mean(hp)
)
arrange函数用法
arrange() 函数的工作方式与 filter() 函数非常相似,但前者不是选择行,而是改变行的顺序。它接受一个数据框和一组作为排序依据的列名(或者更复杂的表达式)作为参数。如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排序
默认按升序排列
starwars %>%
arrange(height)
降序排列
starwars %>%
arrange(desc(height))
多列排序,有先后顺序
starwars %>%
arrange(gender,hair_color)
缺失值总是排在最后