公众号沉寂一个多月后,我终于又回归了!过去的这几个星期忙于期末考试,忙得焦头烂额,现在总算闲下来了。
原本这篇推送我是打算因应社会热点,从经济学的角度探讨一下争议不断的离婚冷静期,做一篇发表在Quarterly Journal of Economics上面的经济学论文的结果重现。这篇论文,Bargaining in the Shadow of the Law: Divorce Laws and Family Distress,探讨了美国的no fault unilateral divorce离婚制度对婚姻暴力的影响,不论是研究对象还是研究方法都十分经典。不过在进行结果重现的过程中,我用R始终没办法得到和作者一致的结果,而作者又是用的Stata,所以我目前还在找是哪里出现了问题。如果之后问题解决了,我会再把这篇论文推出来的。有兴趣的朋友,可以点击文末阅读原文查看这篇论文。
既然难的做不了,今天就先讲个简单的,R语言里面for loop的替代者apply function
。当想到循环的时候,我们一般都是指for或者while等等。虽然我个人非常喜欢使用for loop,但是不得不承认,for loop的运算速度相对来说并没有那么快。熟悉Python的朋友想必对vectorized operations并不陌生,而apply function
就相当于R的vectorized operations,虽然严格意义上来说使用apply
并不能算是。今天我会介绍整个apply function
的家族,包括apply()
,lapply()
,sapply()
,vapply()
,tapply()
,mapply()
。
上面这些都是R自带的命令符,除此之外,purrr
工具包中也有一系列的apply function
,这些不在今天的讨论范围之内。
Apply Function
apply()
假设我们有一个矩阵或者数据框,我们需要对其中的每一个元素或者每一行每一列执行同一运算。比如,有一个的矩阵,我们需要计算每一行所有值的和,我们可以使用for loop循环计算,但是这样不仅耗时,语句也不简洁。这里,我们就可以使用apply()
。该命令符有三个参数,第一个X
是要被执行命令的矩阵或者数据框;第二个参数MARGIN
设定是对行还是列执行命令,数字1代表行,数字2代表列;第三个参数FUN
设定需要执行的命令,如果该命令有额外的参数需要输入,则将其当作新的参数写进apply()
里面。
### 生成矩阵
m 1:24, nrow = 6)
m
如果使用for loop计算每一列的均值,其过程稍稍有点复杂。
c for (i in 1:4) {
c }
c
如果使用apply()
就会简洁许多。