1. 首页
  2. 数据分析

R语言apply家族函数的用法及其比较

点击上方免费订阅学习)

R是一个面向科学工程计算特别是统计计算的工具。与matlab一样,其循环结构的效率也无法让人满意。在平常的编程过程中我们应该尽量避免使用循环,而采用向量化的编程语法可以帮助我们有效提高数据处理效率。本文我们主要介绍如何使用R语言中的apply家族函数来实现向量化运算。

案例中需要用到的数据集

为了更好的理解apply家族函数的用法,本文需要用到mtcars数据集beavers数据集

#mtcars数据集是从1974年 Motor Trend Us 杂志采集到的,数据集的列由油耗以及汽车设计的10个方面共计11个变量组成,共有32条记录。 data("mtcars") head(mtcars)           mpg cyl disp hp drat  wt qsec vs am gear carb Mazda RX4     21.0  6 160 110 3.90 2.620 16.46 0 1  4  4 Mazda RX4 Wag   21.0  6 160 110 3.90 2.875 17.02 0 1  4  4 Datsun 710    22.8  4 108 93 3.85 2.320 18.61 1 1  4  1 Hornet 4 Drive  21.4  6 258 110 3.08 3.215 19.44 1 0  3  1 Hornet Sportabout 18.7  8 360 175 3.15 3.440 17.02 0 0  3  2 Valiant      18.1  6 225 105 2.76 3.460 20.22 1 0  3  1  # beavers数据是对海狸的体温测量数据 data(beavers) head(t(beaver1)[1:4,1:10])     [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9]  [,10] day  346.00 346.00 346.00 346.00 346.00 346.00 346.00 346.00 346.00 346.00 time 840.00 850.00 900.00 910.00 920.00 930.00 940.00 950.00 1000.00 1010.00 temp  36.33 36.34 36.35 36.42 36.55 36.69 36.71 36.75  36.81  36.88 activ  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00

apply()函数

apply()函数的调用格式为apply(X, MARGIN, FUN, ...),其中:

  • X:数值矩阵

  • MARGIN:有1和2两个可选值,1代表按行调用FUN函数,2代表按列调用

  • FUN:调用的函数,可以是R内置的函数,也可是自定义函数

  • …:FUN函数的可选参数

案例演示:

#按行计算最大值 apply(t(beaver1),1,max)    day  time  temp  activ   347.00 2350.00  37.53  1.00   #按列计算均值 apply(mtcars,2,mean)      mpg    cyl    disp     hp    drat     wt    qsec     vs     am    gear    carb   20.090625  6.187500 230.721875 146.687500  3.596563  3.217250 17.848750  0.437500  0.406250  3.687500  2.812500   #将数据集按列运用到自定义函数上 head(apply(mtcars,2,function(x) x%%10))          mpg cyl disp hp drat  wt qsec vs am gear carb Mazda RX4     1.0  6  0 0 3.90 2.620 6.46 0 1  4  4 Mazda RX4 Wag   1.0  6  0 0 3.90 2.875 7.02 0 1  4  4 Datsun 710    2.8  4  8 3 3.85 2.320 8.61 1 1  4  1 Hornet 4 Drive  1.4  6  8 0 3.08 3.215 9.44 1 0  3  1 Hornet Sportabout 8.7  8  0 5 3.15 3.440 7.02 0 0  3  2 Valiant      8.1  6  5 5 2.76 3.460 0.22 1 0  3  1

lapply()函数

lapply()函数的调用格式为lapply(X, FUN, ...),结果的返回是list类型,其组件长度跟X的组件长度相同。其中:

  • X:list对象

  • FUN:调用的函数

  • …:是FUN函数的可选参数

创建组件长度为2的列表 l = list(a=1:10,b=11:20)  #对每个组件求均值 lapply(l, mean) $a [1] 5.5 $b [1] 15.5 #查看返回结果的数据类型 class(lapply(l, mean)) [1] "list  #对每个组件求和 lapply(l, sum) $a [1] 55  $b [1] 155

sapply()函数

sapply()函数是lapply()函数的一个更加友好版本,它实现了对lapply()函数的封装。返回的结果是一个向量或矩阵

l = list(a=1:10,b=11:20) # mean of values using sapply  sapply(l, mean)   a  b   5.5 15.5

tapply()函数

tapply()函数的作用是先将数据分为若干组,然后在每组数据调用指定的函数。函数调用格式为tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE),其中:

  • X:向量数据

  • INDEX:与X的长度相同,如果不是因子类型,会强制转为因子类型

  • FUN:调用的函数

  • …:函数FUN的可选参数

#查看数据结构 str(mtcars$cyl)  num [1:32] 6 6 4 6 8 6 8 4 4 6 ... levels(as.factor(mtcars$cyl)) [1] "4" "6" "8"  tapply(mtcars$mpg,mtcars$cyl,mean)     4    6    8  26.66364 19.74286 15.10000 

mtcars数据集中的列cyl共有三种汽车气缸类型,tapply()函数会自动将数值型向量其转为因子类型,最后对每种汽缸数类型的汽车每加仑汽油行驶里程数求平均值。

by()函数

如上所述,tapply()函数中的参数X只能是一个向量,而by()函数很好的实现了对tapply()函数的封装,使得传入的数据可以是数据框或矩阵。调用格式为by(data, INDICES, FUN, ..., simplify = TRUE)。其中:

  • data:可以是数据框或矩阵

  • INDICES:与data行数相同的因子型向量

  • FUN:对子集(通常data根据INDICES得到的子集也是一个数据框)调用的函数

  • …:函数FUN的可选参数

data(iris)  str(iris) 'data.frame': 150 obs. of 5 variables:  $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...  $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...  $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...  $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...  $ Species   : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...  by(iris[,1:4],iris$Species,colMeans) iris$Species: setosa Sepal.Length Sepal.Width Petal.Length Petal.Width      5.006    3.428    1.462    0.246  ------------------------------------------------------------------------------------  iris$Species: versicolor Sepal.Length Sepal.Width Petal.Length Petal.Width      5.936    2.770    4.260    1.326  ------------------------------------------------------------------------------------  iris$Species: virginica Sepal.Length Sepal.Width Petal.Length Petal.Width      6.588    2.974    5.552    2.026 

本文链接http://www.xueqing.tv/cms/article/158

文章来源:雪晴数据网

PPV课转载的每一篇文章均来源于公开网络,仅供学习使用,不会用于任何商业用途,文章版权归原作者所有,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:149104196@qq.com。转载PPV课网站文章请注明原文章作者,否则产生的任何版权纠纷与PPV课无关。

PPV课-国内领先的大数据学习社区和职业培训平台

R语言apply家族函数的用法及其比较

1、回复“数据分析师”查看数据分析师系列文章

2、回复“案例”查看大数据案例系列文章

3、回复“征信”查看相关征信的系列文章

4、回复“可视化”查看可视化专题系列文章

5、回复“SPPS”查看SPSS系列文章

6、回复“答案”查看hadoop面试题题目及答案

7、回复“爱情”查看大数据与爱情的故事

8、回复“笑话”查看大数据系列笑话

9、回复“大数据1、大数据2、大数据3、大数据4”查看大数据历史机遇连载

PPV课大数据ID:ppvke123(长按可复制)

本公众号专注大数据和数据科学领域,分享领域知识和相关技术文章,探索大数据商业价值,培养和挖掘大数据专业人才,欢迎大家关注!

原文始发于微信公众号(PPV课数据科学社区):R语言apply家族函数的用法及其比较

原创文章,作者:ppvke,如若转载,请注明出处:http://www.ppvke.com/archives/15775

联系我们

4000-51-9191

在线咨询:点击这里给我发消息

工作时间:周一至周五,9:30-18:30,节假日休息