数据处理包plyr和dplyr包的整理
2016-03-01 08:07
447 查看
常见的数据处理包
dplyr——package
1.数据对象:tbl对象
使用dplyr包预处理时建议使用tbl_df()或tbl_cube()或tbl_sql()函数将原数据转换为tbl对象
2.观测筛选
将指定条件的观测筛选出来:filter()函数
filter(.data,…)
.data为tbl对象
…为观测筛选条件,类似于subset()函数,但不同的是filter()函数不能筛选某些关心的变量变量
3.变量选取
select()函数可以筛选指定的变量,而且选择变量时也可以重新命名变量。如果要剔除某些变量,只需要在变量前加上负号”-“。
select()函数,传递的参数:
starts_with(x,ignor.case = TRUE) # 选择以字符x开头的变量
ends_with(x,ignore.case = TRUE) # 选择以字符x结尾的变量
contains(x,ignore.case = TRUE) #选择所有包含x的变量
matches(x,ignore.case = TRUE) #选择匹配正则表达式的变量
num_range(“x”,1:5,width = 2) #选择从x01到x05的数值型变量
one_of(“x”,”y”,”z”) #选择包含在声明变量中的变量
everything() #选择所有变量,一般调整数据集中变量顺序时使用
示例:
4.重命名变量
rename(tbl,newname = oldname,…)
5.数据排序
数据预处理的过程中往往也需要按某些变量进行排序:arrange()函数实现语法:
arrange(.data,…)
arrange()函数默认以某个变量进行升序,如需降序则desc(var_name)
6.数据扩展
通过mutae()函数可以在原始数据集的基础上扩展新变量,并保留原始变量
mutate(.data,…)
同样可以进行数据扩展的函数transmute(),与mutate()函数不同的是,该函数扩展新变量的同时将删除所有原始变量,结果中只有扩展变量。
7.数据聚合
在数据库操作中,往往需要进行聚合函数的应用,这里可以使用summarize()函数实现数据集聚合操作.个人理解的聚合函数就是对数据集中的变量进行统计计算。
语法如下:
summarize(.data,…)
可以用来聚合的函数有:
min(),max(),mean()…等统计量,以及IQR() #返回四分位极差
n() # 返回观测个数
n_distinct() #返回不同的观测个数
first() # 返回第一个观测
last() #返回最后一个观测
nth() #返回n个观测
还可以用group_by()函数实现分组聚合
group_by()语法如下:
group_by(.data,add = FALSE)
8.数据关联
数据框中经常需要将多个表进行连接操作,如左连接、右连接、内连接等,这里dplyr包也提供了数据集的连接操作。如下:
inner_join #内连接
left_join #左连接
right_join #右连接
full_join #全连
semi_join # 返回能够与y表匹配的x表所有记录
anti_join # 返回无法与y表匹配的x表的所有记录
9.数据合并
R基础包cbind()和rbind()函数实现按列的方向进行数据合并和按行的方向进行合并。
dplyr包中也添加了类似功能的函数,分别是bind_cols()函数和bind_rows()函数
10.管道函数
即通过%>%将上一个函数的输出作为下一个函数的输入
11.连接数据库数据
如果需要获取MySQL数据库中的数据时,可以直接使用dplyr包中的src_mysql()函数。
src_mySQL 函数语法如下:
src_mysql(dbname,host = NULL,port = 0L,user = “root”,password = “”,…)
通过以上方式连接MySQL数据库后,使用tbl()函数获取数据集,tbl()函数语法如下:
tbl(src,from =”“)
src为src_mysql()函数对象
from为SQL语句
plyr-package
可以非常方便的实现数据结构之间的转换
其中的函数名有一定的规律,跟输入输出的数据结构相关。
1.函数介绍
.data可以是数组也可以是矩阵;
.margins指定要分析的数组或矩阵的维度,即行维(margins = 1),列维(margins = 2)
.fun为行或列维指定需要处理的函数,可以是R自带的函数,如sum(),mean()等,也可以是自定义函数;
…为指定函数的其他参数;.progress指定以什么样的方式展示程序运行的进度,默认为不显示进度,还可以选择text(文本进度条)、tk(tk进度条)和win(windows系统自带的进度条)
.inform是否指定报错信息,默认不指定,因为设为TRUE,将会降低程序的执行效率,但该参数对bug的处理是有帮助的
示例;
# d*ply函数格式
daply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
ddply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
dlply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
d_ply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
.data 指定为数据框结构;
.variables指定数据框中的分组变量,需要用点号.引起来;
.fun 基于分组变量,可对数据框中的其余变量指定某种函数,可以是R自带的函数,如sum(),mean()等,也可以自定义函数,类似于聚合分析;
.progress和.inform与a*plyr函数参数一致。
示例:
# l*ply函数格式
.data可以指定为列表数据.
其余参数与a*ply()函数和d*ply()函数参数一致。
示例:
dplyr——package
1.数据对象:tbl对象
使用dplyr包预处理时建议使用tbl_df()或tbl_cube()或tbl_sql()函数将原数据转换为tbl对象
2.观测筛选
将指定条件的观测筛选出来:filter()函数
filter(.data,…)
.data为tbl对象
…为观测筛选条件,类似于subset()函数,但不同的是filter()函数不能筛选某些关心的变量变量
library(dplyr) df <- data.frame(x = c("a","b","c","a","b","e","d","f"),y = c(1,2,3,4,5,6,7,8)) dftbl <- tbl_df(df) filter(dftbl,x %in% c("a","b"))
3.变量选取
select()函数可以筛选指定的变量,而且选择变量时也可以重新命名变量。如果要剔除某些变量,只需要在变量前加上负号”-“。
select()函数,传递的参数:
starts_with(x,ignor.case = TRUE) # 选择以字符x开头的变量
ends_with(x,ignore.case = TRUE) # 选择以字符x结尾的变量
contains(x,ignore.case = TRUE) #选择所有包含x的变量
matches(x,ignore.case = TRUE) #选择匹配正则表达式的变量
num_range(“x”,1:5,width = 2) #选择从x01到x05的数值型变量
one_of(“x”,”y”,”z”) #选择包含在声明变量中的变量
everything() #选择所有变量,一般调整数据集中变量顺序时使用
示例:
# 将dftbl数据集中的y变量放到x变量之前 select(dftbl,everything()) #筛选变量的同时,重新命名变量 select(dftbl,x1 = 1,y1 = y)
4.重命名变量
rename(tbl,newname = oldname,…)
rename(dftbl,x1 = x,y1 = y)
5.数据排序
数据预处理的过程中往往也需要按某些变量进行排序:arrange()函数实现语法:
arrange(.data,…)
arrange()函数默认以某个变量进行升序,如需降序则desc(var_name)
arrange(dftbl,y) # y变量升序 arrange(dftbl,desc(y)) #降序操作
6.数据扩展
通过mutae()函数可以在原始数据集的基础上扩展新变量,并保留原始变量
mutate(.data,…)
mutate(dftbl,z = y^2+y-10)
同样可以进行数据扩展的函数transmute(),与mutate()函数不同的是,该函数扩展新变量的同时将删除所有原始变量,结果中只有扩展变量。
transmute(dftbl,z =y^2)
7.数据聚合
在数据库操作中,往往需要进行聚合函数的应用,这里可以使用summarize()函数实现数据集聚合操作.个人理解的聚合函数就是对数据集中的变量进行统计计算。
语法如下:
summarize(.data,…)
可以用来聚合的函数有:
min(),max(),mean()…等统计量,以及IQR() #返回四分位极差
n() # 返回观测个数
n_distinct() #返回不同的观测个数
first() # 返回第一个观测
last() #返回最后一个观测
nth() #返回n个观测
summarize(dftbl,max(y)) summarize(dftbl,n())
还可以用group_by()函数实现分组聚合
group_by()语法如下:
group_by(.data,add = FALSE)
summarize(group_by(dftbl,x),sum(y))
8.数据关联
数据框中经常需要将多个表进行连接操作,如左连接、右连接、内连接等,这里dplyr包也提供了数据集的连接操作。如下:
inner_join #内连接
left_join #左连接
right_join #右连接
full_join #全连
semi_join # 返回能够与y表匹配的x表所有记录
anti_join # 返回无法与y表匹配的x表的所有记录
df2 <- data.frame(x = c("a","b","c"),z = c("A","B","C")) df2tbl <- tbl_df(df2) inner_join(x = dftbl,y = df2tbl,by = "x") semi_join(x = dftbl,y = df2tbl,by = "x") anti_join(x = dftbl,y = df2tbl,by = "x")
9.数据合并
R基础包cbind()和rbind()函数实现按列的方向进行数据合并和按行的方向进行合并。
dplyr包中也添加了类似功能的函数,分别是bind_cols()函数和bind_rows()函数
mydf1 <- data.frame(x = c(1,2,3,4),y = c(10,20,30,40)) mydf2 <- data.frame(x = c(5,6),y = c(50,60)) mydf3 <- data.frame(z = c(100,200,300,400)) bind_rows(mydf1,mydf2) #行变长 bind_cols(mydf1,mydf3)
10.管道函数
即通过%>%将上一个函数的输出作为下一个函数的输入
# 根据数据集dftbl和df2tbl,取出z变量对应的最大y值 inner_join(x = dftbl,y = df2tbl,by = "x") %>% group_by(z) %>% summarise(max(y))
11.连接数据库数据
如果需要获取MySQL数据库中的数据时,可以直接使用dplyr包中的src_mysql()函数。
src_mySQL 函数语法如下:
src_mysql(dbname,host = NULL,port = 0L,user = “root”,password = “”,…)
通过以上方式连接MySQL数据库后,使用tbl()函数获取数据集,tbl()函数语法如下:
tbl(src,from =”“)
src为src_mysql()函数对象
from为SQL语句
src <- src_mysql("test",host = "localhost",user = "root",password = "snake") src
plyr-package
可以非常方便的实现数据结构之间的转换
其中的函数名有一定的规律,跟输入输出的数据结构相关。
1.函数介绍
a*ply函数形式 aaply(.data = ,.margins = ,.fun = ,...,.progress = "none",.inform = FALSE) adply(.data = ,.margins = ,.fun = ,...,.progress = "none",.inform = FALSE) alply(.data = ,.margins = ,.fun = ,...,.progress = "none",.inform = FALSE) a_ply(.data = ,.margins = ,.fun = ,.progress = "none",.inform = FALSE) #输入结构:array,无输出结果
.data可以是数组也可以是矩阵;
.margins指定要分析的数组或矩阵的维度,即行维(margins = 1),列维(margins = 2)
.fun为行或列维指定需要处理的函数,可以是R自带的函数,如sum(),mean()等,也可以是自定义函数;
…为指定函数的其他参数;.progress指定以什么样的方式展示程序运行的进度,默认为不显示进度,还可以选择text(文本进度条)、tk(tk进度条)和win(windows系统自带的进度条)
.inform是否指定报错信息,默认不指定,因为设为TRUE,将会降低程序的执行效率,但该参数对bug的处理是有帮助的
示例;
library(plyr) a <- array(data = 1:500000,dim = c(100000,5)) # 对每一行求均值,不显示进度条 test1 <- aaply(.data = a,.margins = 1,.fun = mean,.progress = "none") head(test1) # 对每一行求标准差,以文本的形式显示进度条 test2 <- adply(.data = a,.margins = 1,.fun = sd,.progress = "text") head(test2) # 对每一列求和,以tk形式显示进度条 a2 <- array(rnorm(100000),dim = c(100,1000)) test3 <- alply(.data = a2,.margins = 2,.fun = sum,.progress = "tk") head(test3) # 对每一列求最大值,以windows自带进度条显示进度 a3 <- array(rnorm(100000),dim = c(100,1000)) test4 <- a_ply(.data = a3,.margins = 2,.fun = max,.progress = "win")
# d*ply函数格式
daply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
ddply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
dlply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
d_ply(.data = ,.variables = ,.fun = ,…,.progress = “none”,.inform = FALSE)
.data 指定为数据框结构;
.variables指定数据框中的分组变量,需要用点号.引起来;
.fun 基于分组变量,可对数据框中的其余变量指定某种函数,可以是R自带的函数,如sum(),mean()等,也可以自定义函数,类似于聚合分析;
.progress和.inform与a*plyr函数参数一致。
示例:
# 构建自定义函数 fun <- function(data) apply(data,2,mean) daply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun) ddply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun) dlply(.data = iris[,1:4],.variables = .(iris$Species),.fun = fun)
# l*ply函数格式
laply(.data = ,.fun = ,...,.progress = "none",.inform = FALSE) ldply(.data = ,.fun = ,...,.progress = "none",.inform = FALSE) llply(.data = ,.fun = ,...,.progress = "none",.inform = FALSE) l_ply(.data = ,.fun = ,...,.progress = "none",.inform = FALSE)
.data可以指定为列表数据.
其余参数与a*ply()函数和d*ply()函数参数一致。
示例:
x1 <- 1:100 x2 <- seq(from = 100,to = 1000,by = 2) x3 <- runif(150,min = 10,max = 100) # 列表由向量构成 l1 <- list(x1 = x1,x2 = x2,x3 = x3) laply(.data = l1,.fun = mean) ldply(.data = l1,.fun = summary) llply(.data = l1,.fun = quantile) l_ply(.data = l1,.fun = summary) # 构建数据框dll y11 <- rnorm(n = 100,mean = 10,sd = 5) y12 <- rt(n = 100,df = 3) y13 <- rf(n = 100,df1 = 2,df2 = 3) y14 <- factor(x = c("low","potential","high"),ordered = T) y15 <- sample(y14,size = 100,replace = TRUE) d11 <- data.frame(y1 = y11,y2 = y12,y3 = y13,y5 = y15) head(dll) # 构建数据框d21 y21 <- 1:100 y22 <- seq(from = 1,to = 2,length = 100) y23 <- rchisq(n = 100,df = 8) y24 <- factor(x = c("A","B","C","D"),order = T) y25 <- sample(y24,size = 100,replace = TRUE) d21 <- data.frame(y21 = y21,y22 = y22,y23 = y23,y25 = y25) head(d21) # 列表由数据框组成 l2 <- list(first = d11,second = d21) library(psych) fun <- function(data) describeBy(data[,1:3],group = data[,4]) llply(.data = l2,.fun = fun,.progress = "none") llply(.data = l2,.fun = fun,.progress = "text")
相关文章推荐
- Java之Vector特有功能使用
- 一天一个算法之质数判断
- Java中基础类库使用
- 微信开发的多图文回复方法
- STL list链表的用法详细解析
- servlet中service() doGet() doPost() 方法
- 【BZOJ 1997】[Hnoi2010]Planar
- ZOJ 3822 Domination(概率dp)
- BST树,B树、B-树、B+树、B*树
- 【BZOJ 2324】 [ZJOI2011]营救皮卡丘
- [leetcode]House Robber 分享一个很easy的解法
- Java 和 c++的区别 (做题过程中整理)
- 数值方法专题
- .NET Web的身份认证
- 【bzoj1856】[Scoi2010]字符串 组合数学
- 遍历集合,判断并添加元素的集中方法
- Grab Cut
- 【BZOJ 2809】 [Apio2012]dispatching
- 16位,32位,64位操作系统下,各类型的长度整理
- day24:park Hash Shuffle内幕彻底解密