懒癌必备-dplyr和data.table让你的数据分析事半功倍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lll1528238733/article/details/76762734

duang,duang!Erin又上线为大家分享干货来了。
最近Erin在做信用风险评级模型的开发,几千行的代码敲的我头晕眼花。作为一个懒癌晚期,并且追求高效率的数据er,怎么能受得了浪费时间去造轮子呢。接下来,我就为大家分享几个我在工作当中最常用来做数据分析用到的包,dplyr和data.table,我保证你get到这两个包后,就再也不想用R里面自带的基础包函数进行数据分析了!!(贼笑中)

dplyr包

R语言中最为重要的包(之一)!
它可以让数据分析功能更加强大,代码更加简洁。你可以随心所欲的操作它,使用它获取你想要的数据,而且它的语法非常简单,非常直白。在编程语言里面,说语法简单,意味着编程语言与我们正常人的逻辑思维是一致的。它相对于R自带的筛选方法会更高效,我们不需要花很多时间去等待机器反应。
我工作当中,或者是公认的最常用的方法,无非就是下面几种:
① 数据过滤
② 数据选择
③ 数据排序
④ 数据转换
⑤ 数据分组
⑥ 数据抽样

大家做数据分析,会发现90%的时间都在与这几个打交道。dplyr很庆幸,都提供了关于常用方法的一些函数。
在GitHub上面,之前有人做了一个统计,以下几个函数最为常用:

filter( ) 过滤

filter(df,cond1,cond2,…) 用逗号,隔开表示条件是and的关系
filter(df,cond1|cond2|…) 用竖线|隔开表示条件是or的关系
slice(df,80:100) 选取索引80到100的数据

arrange( ) 对数据框进行排序

arrange(df,V1,desc(V2),V3) 对V1,V3升序排序,对V2降序排序

※arrange的语法非常简单,功能也很强大,我们再也不要用order()函数了

select( ) 选择列

select(df,V1,V2,V3) 选择V1,V2,V3列数据
select(df,V1:V3) 选择V1到V3列的所有数据
t<-select(df,-c(V1,V3)) 选择除了V1,V3以外的所有列

distinct( ) 去重

distinct(df,V1,V2) 根据V1和V2两个条件来进行去重

在基础包里面也有一个去重函数unique()
※注意distinct()可以针对某些列进行去重,而unique()只能对整个数据框进行去重。

mutate( ) 为数据增加新列

mutate(df,vnew1=v1-v2,vnew2=vnew1+v3)

与基础包里的transform()函数接近,但mutate可以使用你刚刚创建的column,
transform则不行,会报错:”找不到对象vnew”

summarise( ) 计算统计数据

summarise(df,sum(v1))

sample_n(df,1000) 随机抽取1000条数据
sample_frac(df,0.7) 随机抽取70%的数据

看了以上这几个函数,是不是觉得dplyr包超简单!对!我们要的就是简洁简单!有这么好的作者给你开发了这么好的packages,你就放心大胆的用呗,不用自己去写基础代码造轮子的事,多好!!找到合适的packages并学习使用它,绝对会让我们数据分析工作事半功倍!

我们有没有发现dylyr包中函数使用的一些规律?
有的!
①第一个参数都是数据集df
②查询条件都是关于如何操作数据集的,在列上面进行操作
③返回的都是新的数据集,不会改变原始数据集

在介绍下一个包之前,我们先来引入一个dplyr包的综合运用:

grouped<-group_by(df,v1,V2) #df被v1,v2进行分组
newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))

以上这段代码我们使用group_by和summarise的结合实现了对数据集分组分析,并进行统计量计算的一个功能。学习了下面的data.table包以后,你再回来看看这个,你绝对不会选择这种写法并且超级鄙视它!

data.table包

dplyr已经可以满足我们数据分析工作中大部分的需求,后来该包的作者又开发了一个炫酷吊炸天的包“data.table”
如果你的日常处理数据在几万到十几万行,那么用dplyr就完全足够了。
如果你的日常处理数据量非常大,有上亿行的数据处理需求,这个时候你完全可以放心大胆的使用data.table
这个包异常的高效,速度非常的快!!
官网上面有关于data.table包对于dplyr的提升和改进:

这里写图片描述

作为课代表的我来帮大家简单的总结一下:
我们都知道R有个令人诟病的缺点就是跑起来耗内存,data.table相对于dplyr
更快、更节省内存了!data.table这个包的语法用起来稍微有点奇怪(哈哈~),
但是速度亲妈快啊!!小伙伴们一定不能错过的绝世好包

铺垫了这么多,来来来,数据分析神器data.table走起来!!

还是那句话,讲几个最常用的函数,就算你的数据量大到逆天,data.table跑起来都是游刃有余的。剩下的大家有什么特殊需求再去下载官方文档看就好啦!

DT<-data.table()
DT[i,j,by]
take DT,subset rows using i,then calculate j grouped by by
我们在横轴上过滤数据,用by进行分组,然后在列上面进行计算。

使用i

DT[35] #选取3到5行的数据
class(DT)
[1] "data.table" "data.frame"
DT[v1=="A"] #基于条件的选择
DT[v1 %in% c("A","B")]

使用j

DT[,v1] #选择v1列

那如果我要选择多列呢,大家注意一下这里不是用c()来选取了,
而是通过.()来选取,注意前面有一个”.”号,所以我说data.table的语法有点奇怪呢。

DT[,.(v1,v3)]
#在j上调用函数
DT[,sum(v1)]
DT[,.(sum(v1),sd(v3))]

data.table居然支持直接在j上进行列的计算,看到这里是不是觉得超牛逼,关键是代码非常简洁,一句话的事,就帮我们完成数据的筛选和计算了!

DT[,.(sum_v1=sum(v1),sd_v3=sd(v3))]

还可以直接给计算的列赋予名称哦!!功能强大得我都要笑开花了!

使用by

这还只是小试牛刀,你忘了我们还有个by吗!!

DT[,.(mean_age=mean(age),sum_sale=sum(sales)),by=.(v1,v2)]

回顾一下我们在上一节最后保留的一段代码:

group_by()
grouped<-group_by(df,v1,V2) #data被v1,v2进行分组
newdata<-summarise(grouped,mean_age=mean(age),sum_sale=sum(sales))

以上两段代码的效果是等同的!data.table把我们刚刚用group_by和summarise组合才能实现的功能,直接在一句代码里面就实现了,而且代码的可读性和可扩展运用性非常强!

以上讲的这些只是我工作中data.table用得最多的功能,它的强大之处还远远不止这些!如果你想深入,可以去官网下载文档,你绝对值得拥有!(反正我用了data.table以后就再也不想用R里面基础包自带的函数了,今天就黑到这里,匿了~)

——Copyright Reserved by Erin

猜你喜欢

转载自blog.csdn.net/lll1528238733/article/details/76762734
今日推荐