R数据分析:apply()的各种变体你分清了吗?
apply函数可以看作是循环的替代方法,在R语言中,apply函数的变体有很多,好多时候同学搞不清到底该用apply呢,还是tapply呢还是sapply呢。今天就给大家系统地写一写。
The apply() function can be feed with many functions to perform redundant application on a collection of object (data frame, list, vector, etc.). The purpose of apply() is primarily to avoid explicit uses of loop constructs.
apply函数的重要作用就是把一个函数给一群数据应用上,这个一群数据可以是data frame, list, vector等等,有什么好处呢?它可以大大地提高代码的整洁性和灵活性。
本文章会给大家详细介绍以下函数:
- apply() function
- lapply( )function
- sapply() function
- tapply() function
apply() 函数
apply() takes Data frame or matrix as an input and gives output in vector, list or array.
apply需要的输入是一个矩阵或者数据框,但是输出却不是这两个类型,这个是需要注意的,一般而言,apply的用法如下:
apply(X, MARGIN, FUN)
上面的形式中X代表我们输入的数据框或者矩阵,MARGIN为应用函数的方向,可以取1或者2,1代表行,2代表列,FUN就是你要应用的函数。
看例子:
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)
m1
a_m1 <- apply(m1, 2, sum)
a_m1
以上的代码就是生成了一个矩阵,然后按列进行求和,看输出:
imagelapply() 函数
lapply可以接受的输入类型为list, vector or data frame, 但是其输出是列表,而且是把函数应用到对象的每一个元素,这个与apply不同:
lapply() function is useful for performing operations on list objects and returns a list object of same length of original set.
lapply中的l代表list,lapply的基本用法如下:
lapply(X, FUN)
其中X为输入的数据,FUN为你想应用到数据中每个元素的函数。因为lapply是应用到每一个元素上的,所以就不需要MARGIN这个参数了嘛。
看例子:
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")
movies_lower <-lapply(movies, tolower)
str(movies_lower)
上面的代码中,我想把所有的大写单词改写成小写单词,我就给所有元素应用tolower就好啦。看输出:
image此时就全部为小写单词了。
sapply() 函数
sapply() function takes list, vector or data frame as input and gives output in vector or matrix. It is useful for operations on list objects and returns a list object of same length of original set. sapply() function does the same job as lapply() function but returns a vector.
sapply和lapply的做的事情是一样的,但是sapply输出的是向量,lapply输出的是list,这个就是最大的差别。
sapply的一般的用法如下,和lapply一模一样,这儿就不多给大家解释了:
sapply(X, FUN)
直接看例子:
dt <- cars
lmn_cars <- lapply(dt, min)
smn_cars <- sapply(dt, min)
lmn_cars
上面的代码中,我把cars这个数据集分别用了lapply和sapply,都是求最小值,看结果:
image看见没,一个输出是list另一个是向量。就这点区别。
tapply() 函数
tapply() computes a measure (mean, median, min, max, etc..) or a function for each factor variable in a vector. It is a very useful function that lets you create a subset of a vector and then apply some functions to each of the subset.
tapply 和上面的三个就有点不同了,tapply可以将函数用于一个向量中的子集。就是说,先造子集再给子集运用你想运用的函数。非常适合分组统计。
tapply的一般用法为:
tapply(X, INDEX, FUN = NULL)
其中X为你的数据,INDEX为你想要的子集的索引,FUN为你想运用的函数。
还是给大家写一个例子:
我想给鸢尾花数据集分类别求其的花瓣宽度的中位数,我就可以写出如下的代码:
data(iris)
tapply(iris$Sepal.Width, iris$Species, median)
image
上面的代码意思就是我要给irisSpecies进行,分好组后对每个组运用median函数。
小结
今天给大家写了apply函数的几种变体,大家记住,apply需要MARGIN参数来规定运用函数的方向,lapply和sapply基本一样,唯一的区别就是输出结果的类型不一样,而tapply可以帮我们很快地进行分组统计。
感谢大家耐心看完,自己的文章都写的很细,代码都在原文中,希望大家都可以自己做一做,请关注后私信回复“数据链接”获取所有数据和本人收集的学习资料。如果对您有用请先收藏,再点赞转发。
也欢迎大家的意见和建议。
如果你是一个大学本科生或研究生,如果你正在因为你的统计作业、数据分析、论文、报告、考试等发愁,如果你在使用SPSS,R,Python,Mplus, Excel中遇到任何问题,都可以联系我。因为我可以给您提供好的,详细和耐心的数据分析服务。
如果你对Z检验,t检验,方差分析,多元方差分析,回归,卡方检验,相关,多水平模型,结构方程模型,中介调节,量表信效度等等统计技巧有任何问题,请私信我,获取详细和耐心的指导。
If you are a student and you are worried about you statistical #Assignments, #Data #Analysis, #Thesis, #reports, #composing, #Quizzes, Exams.. And if you are facing problem in #SPSS, #R-Programming, #Excel, Mplus, then contact me. Because I could provide you the best services for your Data Analysis.
Are you confused with statistical Techniques like z-test, t-test, ANOVA, MANOVA, Regression, Logistic Regression, Chi-Square, Correlation, Association, SEM, multilevel model, mediation and moderation etc. for your Data Analysis...??
Then Contact Me. I will solve your Problem...
加油吧,打工人!