R语言︱数据集分组、筛选(plit–apply–combine模式、dplyr、data.。。。

更新时间:2023-06-18 09:50:34 阅读: 评论:0

R语⾔︱数据集分组、筛选(plit–apply–combine模式、
dplyr、data.。。。
R语⾔︱数据集分组
⼤型数据集通常是⾼度结构化的,结构使得我们可以按不同的⽅式分组,有时候我们需要关注单个组的数据⽚断,有时需要聚合不同组内的信息,并相互⽐较。
⼀、⽇期分组
1、关于时间的包都有很多很好的⽇期分组应⽤。俯卧撑标准姿势
上海辰山植物园
2、cut()函数
cut(x, n):将连续型变量x分割为有着n个⽔平的因⼦
cut(x, breaks, labels = NULL,
林黛玉几岁进贾府include.lowest = FALSE, right = TRUE, dig.lab = 3,
ordered_result = FALSE, ...)
介绍⼀种按照⽇期范围——例如按照周、⽉、季度或者年——对其进⾏分组的超简便处理⽅式:R语⾔的cut()函数。
假设vector中存在以下⽰例数据:
vDates <- as.Date(c("2013-06-01", "2013-07-08", "2013-09-01", "2013-09-15")) #as.Data()函数的作⽤⾮常重要;如果没有它,R语⾔会认为以上内容仅仅是数字串⽽ [1] "2013-06-01" "2013-07-08" "2013-09-01" "2013-09-15"
vDates.bymonth <- cut(vDates, breaks = "month")
[1] 2013-06-01 2013-07-01 2013-09-01 2013-09-01
Levels: 2013-06-01 2013-07-01 2013-08-01 2013-09-01柠檬解酒吗
Dates <- data.frame(vDates, vDates.bymonth)
3、dplyr包
#dplyr中基本函数 filter——数据筛选(筛选观测值,⾏)
filter(Hdma_dat,pclass == 1)
>>>>>>>##
#dplyr中基本函数 lect——⼦集选取(筛选变量,列)
lect(Hdma_dat,pclass,survived) ##选择pclass变量
⼆、数据分组以及分组汇总
1、cut函数
b<- cut(a, 5,labels=F)    #将数据平均分成5组,rank=5代表⼤,rank=1代表⼩
2、aggregate函数——分组汇总
result1<-aggregate(orders$AMOUNT, orders[,c("SELLERID","CLIENT")],sum)
result2<-aggregate(orders$AMOUNT, orders[,c("SELLERID","CLIENT")],max)
result<-cbind(result1,result2$x)
代码解读:
1.从名字就可以看出,aggregate是专⽤于分组汇总的函数,它的输⼊参数和计算结果都是数据框,⽤法相对简单。
2.aggregate函数不能对分组后的数据进⾏多种汇总计算,因此要⽤两句代码分别实现sum和max算法,最后再⽤cbind拼合。显然,上述代码在性能和易⽤性上存在不⾜。
3.aggregate函数对分组字段的顺序有⼀个奇怪的要求:必须反向排列。鉴于这个怪要求,先对CLIENT分组再对SELLERID分组就必须写成:
orders[,c("SELLERID","CLIENT")]。如果按照正常的思维习惯写代码,结果将是错误的。
4.不仅代码的写法违反正常的思维习惯,计算后的结果也很怪异:SELLERID字段会排在CLIENT之前。事实上,为了使计算结果更符合业务逻辑,上述的代码还要继续加⼯才⾏。
总结:aggregate函数勉强可⽤,但在性能和⽅便性上存在不⾜,代码的写法、计算结果、业务逻辑这三者不⼀致。
各器官排毒时间表
三、split – apply – combine模式——分组处理模式
对数据的转换,可以采⽤split – apply – combine模式来进⾏处理:
split:把要处理的数据分割成⼩⽚断;
apply:对每个⼩⽚断独⽴进⾏操作;
combine:把⽚断重新组合。
R 当中是split( ),*apply( ),aggregate( )…,以及plyr包
1、split函数
split( )的基本⽤法是:group <- split(X,f)
其中X 是待分组的向量,矩阵或数据框。f是分组因⼦。
##按照已有的类别数据,分类
鸡肉炒多久能熟g<-split(Cars93,Cars93$Origin)    #按照cars93数据集,按照origin进⾏分组
##例2:对矩阵分组(按列)
m<-cbind(x=1:10,y=11:20)
split(m,col(m))                      #col代表m的下标(⾏)
$`1`
[1] 1 2 3 4 5 6 7 8 9 10
$`2`
[1] 11 12 13 14 15 16 17 18 19 20
> col(m)
[,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    1    2
七夕诗[4,]    1    2
[5,]    1    2
[6,]    1    2
[7,]    1    2
[8,]    1    2
[9,]    1    2
[10,]    1    2
##后续处理
##计算组的长度和组内均值
> sapply(g,length)
USA non-USA
48 45
> sapply(g,mean)
USA non-USA
18.57292 20.50889
##⽤lapply也可以,返回值是列表
> lapply(g,mean)
$USA
[1] 18.57292
$`non-USA`
[1] 20.50889
##分组结果
summary(g)
split还有⼀个逆函数,unsplit,可以让分组完好如初。
在ba包⾥和split功能接近的函数有cut(对属性数据分划),strsplit(对字符串分划)以及subt(对向量,矩阵或数据框按给定条件取⼦集)等。
举例:
a<-matrix(1:20,ncol=4)
[,1] [,2] [,3] [,4]
[1,]    1    6  11  16
[2,]    2    7  12  17
[3,]    3    8  13  18
[4,]    4    9  14  19
[5,]    5  10  15  20
a[row(a)==1&col(a)==1] #将返回1,第⼀⾏第⼀列
a[row(a)==1&col(a)==2] #将返回6,第⼀⾏第⼆列
2、⼀个⽹络例⼦:
sp<-split(orders,orders[,c("SELLERID","CLIENT")],drop=TRUE)
result1<-lapply(sp,FUN=function(x) sum(x$AMOUNT))
result2<-lapply(sp,FUN=function(x) max(x$AMOUNT))
result<-cbind(result1,result2)
代码解读:
1.Split函数的作⽤是将数据框按照指定字段分组,但不做后续计算。lapply函数可以对每组数据都执⾏同样的算法。Split和lapply两者结合可以实现本案例。
2.由于分组后的数据可以复⽤,因此本算法⽐aggregate性能更⾼。
3.Lapply函数也不⽀持多种统计⽅法,因此也要⽤两句代码分别实现sum和max算法,最后再⽤cbind拼合。另外,本算法还要额外⽤到split函数,因此在易⽤性上没有改进,反⽽是更差了。
4.分组顺序仍然要违反正常的思维习惯,必须反写成:orders[,c("SELLERID","CLIENT")]。
5.计算结果需要⼤幅加⼯,很不⽅便。可以看到,计算结果中的第⼀列实际上是“SELLERID.CLIENT”,我们需要把它拆分成两列并调换顺序才⾏。
总结:
本算法在性能上有所提⾼,但在易⽤性上明显不⾜,在代码写法、业务逻辑、计算结果上仍然存在不⼀致。
3、Lapply 是 apply 函数族
Lapply 是 apply 函数族的⼀份⼦,类似的函数还有 sapply 和 tapply。其中 sapply 的⽤法和 lapply 的区别只在参数上,如下:
sp<-split(orders,orders[,c("SELLERID","CLIENT")],drop=TRUE)
result1<-sapply(sp,simplify=FALSE,FUN=function(x) sum(x$AMOUNT))
进行的同义词
result2<-sapply(sp,simplify=FALSE,FUN=function(x) max(x$AMOUNT))
result<-cbind(result1,result2)
tapply 专⽤于数据框,按理说最适合解决本案例,但事实并⾮如此。 tapply 只对单字段分组适⽤,在进⾏双字段联合分组时其结果为⼆维矩阵,⽤户还需要进⾏复杂的处理才⾏,⽐如 tapply(orders$AMOUNT, orders[,c("SELLERID","CLIENT")],function(x) sum(x))

本文发布于:2023-06-18 09:50:34,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1043836.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:分组   数据   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图