还没决定

R-dplyr

​ dplyr 是一个做数据框处理和汇总的包, 有着更简单的语法和更快的处理速度, 功能十分强大. dplyr 的目的就是设计一个数据处理的语法, 通过这个语法可以设计一些简单的操作方式, 针对data.frame 或者一个数据库中的数据进行同样的数据操作。

​ dplyr 把大部分数据处理的形式写成了一些基本函数, 我们能够很容易的调用它, 并且提供了简单的处理语法, 便于快速编写R 代码, 同时它能够快速完成计算。

​ dplyr 定义的数据类型是tbl, 也可以接受data.frame, cube, sql 对象. tbl 对象的特征将结合例子进行说明.首先进行安装: install.packages(“dplyr”).

​ tbl可以当作date.frame操作,反之不可。


数据对象:tbl对象
使用dplyr包预处理时建议使用tbl_df()或tbl_cube()或tbl_sql()函数将原数据转换为tbl对象

1
2
3
4
5
6
# 使用dplyr 包中的函数, 均需提前调入dplyr包
> library(dplyr)
> df_tbl <- tbl_df(df)
# df_tbl 既是data.frame 格式的数据, 同时又有tbl 格式的特点
> class(df_tbl)
[1] "tbl_df" "tbl" "data.frame"

​ dplyr 的基本函数有五个, 分别为filter(), select(), arrange(),mutate(), 和summarise(). 这五个数据函数有相同的输入模式, 第一个选项为数据框或者tbl 对象, 之后选项为筛选(运算) 条件, 最后输出的结果和输入的数据的类型相同.

select:用于选取一列或者多列

filter:用于选取特定条件下的某些行

arrange:用于实现数据一列或多列的升降排序

mutate:用于在数据集中添加列

summarise:用于实现数据汇总(配合group_by使用效果更佳)


筛选:filter()

对列条件刷选 返回满足观测条件的观测值 :按给定的逻辑判断筛选出符合要求的子数据集, 类似于 base里面subset() 函数

1
2
3
4
5
6
7
8
9
> filter(mtcars,am==1,mpg <20) # 且的关系(筛选条件可无限增加),使用逗号,注意!
> filter(mtcars,am==1|mpg <20) # 或的关系
> filter(dftbl,x %in% c("a","b")) # 单变量的或,相当于py的isin()
-------------------------------------------------------------------------------------
# base中的subet()
# 用条件筛选完行后,再筛选列
> df <- subset(df,
age>=25 & gender=="M",
select=c("A","B","C"))

选择:select()

用列名作参数来选择子数据集

select()函数可以筛选指定的变量,而且选择变量时也可以重新命名变量。如果要剔除某些变量,只需要在变量前加上负号”-“.
select()函数,传递的参数:
starts_with(“x”,ignore.case = TRUE) # 选择以字符x开头的变量 , 默认忽略大小写
ends_with(“x”) # 选择以字符x结尾的变量
contains(“x”) #选择所有包含x的变量
matches(“x”) #选择匹配正则表达式的变量
num_range(“x”,1:5,width = 2) #选择从x01到x05的数值型变量
one_of(“x”,”y”,”z”) #选择包含在声明变量中的变量
everything() #选择所有变量,一般调整数据集中变量顺序时使用

1
2
3
4
5
6
7
8
9
10
11
12
# 选取部分列构建新表
> select(mtcars,mpg,am)
# 把列名按数字对待:选取mtcars数据集中am至carb列
> select(mtcars,am:carb)
# 排除列,负号
> select(mtcars,-(am:carb))
# 将dftbl数据集中的y变量放到x变量之前
select(dftbl,everything())
# 筛选变量的同时,重新命名变量
select(dftbl,x1 = 1,y1 = y)

排列 arrange()

1
2
3
4
5
6
7
> arrange(mtcars,am,gear,carb) # 全部默认正序排列
> arrange(mtcars,am,desc(gear)) # desc()部分倒序排列
--------------------------------------------------------------------------
# base里使用order()排序
> newdf <- df[order(df$A),] # 创建一个新数据集,依A特征升序排序
> newdf <- df[order(df$A, df$B),] # 依A特征升序,A相同的再依B特征升序
> newdf <- df[order(df$A, -df$B),] # 加上符号-就是降序

变形 mutate()

与 base::transform() 相似, 优势在于可以在同一语句中对刚增加的列进行操作

1
2
3
4
5
6
7
8
9
# 原数据集新增加一列num,为mpg与hp之和
> mutate(mtcars,num=mpg+hp)
# 在同一语句中对刚增加的列进行操作:
> mutate(mtcars,num1=mpg+hp,num2=num1-qsec)
----------------------------------------------------------------------------------------
# 第二个新变量使用了第一个新变量gain,虽然更power了,但感觉实际操作影响不大
> mutate(hflights_df, gain = ArrDelay - DepDelay, gain_per_hour = gain / (AirTime / 60))
# 而同样操作用R自带函数 transform() 的话就会报错:
> transform(hflights, gain = ArrDelay - DepDelay, gain_per_hour = gain / (AirTime / 60))

汇总:summarise()

在使用时需注意, summarise() 的汇总函数是以向量为输入, 单一值为输出的函数

1
2
3
4
5
> summarise(df_tbl,ID_mean=mean(ID), Age_mean=mean(Age,na.rm = TRUE))
# A tibble: 1 × 2
ID_mean Age_mean
<dbl> <dbl>
1 42.5 53.35714

分组:group_by()

1
2
3
4
5
6
7
8
9
10
> summarise(group_by(df_tbl,Sex),
Age_mean=mean(Age,na.rm = TRUE),
Age_min=min(Age),
Age_max=max(Age),
n_distinct(Improved)) # 计算唯一值的个数
# A tibble: 2 × 5
Sex Age_mean Age_min Age_max `n_distinct(Improved)`
<fctr> <dbl> <int> <int> <int>
1 Female 53.50847 23 74 3
2 Male 53.00000 27 70 3

变量重命名 rename()

1
> rename(tbl_mtcars,mpg1=mpg)

选取行:随机sample()&非随机slice()

1
2
3
4
5
6
7
8
## 非随机性选取部分列:slice()
> slice(mtcars,1:10)
# 随机选取样本:sample_n()
# 选取10个样本
> sample_n(mtcars,10)
# 选取10%的样本
> sample_frac(mtcars,0.1)

数据关联 join()

1
2
3
4
5
6
7
8
9
10
11
12
13
内联:inner_join
左联:left_join
右联:right_join
全联:full_join
semi_join:返回能够与y表匹配的x表的所有记录
anti_join:返回无法与y表匹配的x表的所有记录
inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
semi_join(x, y, by = NULL, copy = FALSE, ...)
anti_join(x, y, by = NULL, copy = FALSE, ...)

数据合并 bind_cols() & bind_rows()

1
2
3
4
5
# 数据表需要有相同的列数
> bind_rows(data1, data2)
# 数据表需要有相同的行数
> bind_cols(data1, data2)

计数函数:count()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 对Sex特征的分类计数
> count(df_tbl,Sex)
# A tibble: 2 × 2
Sex n
<fctr> <int>
1 Female 59
2 Male 25
# 多层的分类计数
> count(df_tbl,Sex,Improved)
Source: local data frame [6 x 3]
Groups: Sex [?]
Sex Improved n
<fctr> <ord> <int>
1 Female None 25
2 Female Some 12
3 Female Marked 22
4 Male None 17
5 Male Some 2
6 Male Marked 6

管道函数 %>%

dplyr包特有,即通过%>%将上一个函数的输出作为下一个函数的输入,免写数据名。

1
2
3
4
5
6
7
8
9
10
> summarise(group_by(df_tbl,Sex),
Age_mean=mean(Age,na.rm = TRUE),
Age_min=min(Age),
Age_max=max(Age),
n_distinct(Improved))
# 使用管道函数如下,在函数需要多句合并才使用比较好,一般情况下用不上
group_by(df_tbl,Sex) %>% summarise(Age_mean=mean(Age,na.rm = TRUE),
Age_min=min(Age),
Age_max=max(Age),
n_distinct(Improved))

小技巧函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 计算唯一值的个数
> n_distinct(df$Sex)
[1] 2
min(),max(),mean()…等统计量,以及IQR() #返回四分位极差 
n() # 返回观测个数 
n_distinct() #返回不同的观测个数 
first() # 返回第一个观测 
last() #返回最后一个观测 
nth() #返回n个观测

连接数据库

1
2
3
4
5
6
7
8
9
10
# 如果需要获取MySQL数据库中的数据时,可以直接使用dplyr包中的src_mysql()函数
> src <- src_mysql(dbname,host = NULL,
port = 0L,
user = “root”,
password = “”,
…)
# 通过以上方式连接MySQL数据库后,使用tbl()函数获取数据集,tbl()函数语法如下:
tbl(src,from =" ")
# src为src_mysql()函数对象
# from为SQL语句