duang,duang!Erin又上线为大家分享干货来了。
最近Erin在做信用风险评级模型的开发,几千行的代码敲的我头晕眼花。作为一个懒癌晚期,并且追求高效率的数据er,怎么能受得了浪费时间去造轮子呢。接下来,我就为大家分享几个我在工作当中最常用来做数据分析用到的包,dplyr和data.table,我保证你get到这两个包后,就再也不想用R里面自带的基础包函数进行数据分析了!!(贼笑中)
R语言中最为重要的包(之一)!
它可以让数据分析功能更加强大,代码更加简洁。你可以随心所欲的操作它,使用它获取你想要的数据,而且它的语法非常简单,非常直白。在编程语言里面,说语法简单,意味着编程语言与我们正常人的逻辑思维是一致的。它相对于R自带的筛选方法会更高效,我们不需要花很多时间去等待机器反应。
我工作当中,或者是公认的最常用的方法,无非就是下面几种:
① 数据过滤
② 数据选择
③ 数据排序
④ 数据转换
⑤ 数据分组
⑥ 数据抽样
大家做数据分析,会发现90%的时间都在与这几个打交道。dplyr很庆幸,都提供了关于常用方法的一些函数。
在GitHub上面,之前有人做了一个统计,以下几个函数最为常用:
filter(df,cond1,cond2,…) 用逗号,隔开表示条件是and的关系
filter(df,cond1|cond2|…) 用竖线|隔开表示条件是or的关系
slice(df,80:100) 选取索引80到100的数据
arrange(df,V1,desc(V2),V3) 对V1,V3升序排序,对V2降序排序
※arrange的语法非常简单,功能也很强大,我们再也不要用order()函数了
select(df,V1,V2,V3) 选择V1,V2,V3列数据
select(df,V1:V3) 选择V1到V3列的所有数据
t<-select(df,-c(V1,V3)) 选择除了V1,V3以外的所有列
distinct(df,V1,V2) 根据V1和V2两个条件来进行去重
在基础包里面也有一个去重函数unique()
※注意distinct()可以针对某些列进行去重,而unique()只能对整个数据框进行去重。
mutate(df,vnew1=v1-v2,vnew2=vnew1+v3)
与基础包里的transform()函数接近,但mutate可以使用你刚刚创建的column,
transform则不行,会报错:”找不到对象vnew”
summarise(df,sum(v1))
sample_n(df,1000) 随机抽取1000条数据
sample_frac(df,0.7) 随机抽取70%的数据
我们有没有发现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包以后,你再回来看看这个,你绝对不会选择这种写法并且超级鄙视它!
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进行分组,然后在列上面进行计算。
DT[3:5] #选取3到5行的数据
class(DT)
[1] "data.table" "data.frame"
DT[v1=="A"] #基于条件的选择
DT[v1 %in% c("A","B")]
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吗!!
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组合才能实现的功能,直接在一句代码里面就实现了,而且代码的可读性和可扩展运用性非常强!
——Copyright Reserved by Erin