<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apply on 格物堂</title><link>https://gewutang.cn/tags/apply/</link><description>Recent content in Apply on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 09 Nov 2011 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/apply/index.xml" rel="self" type="application/rss+xml"/><item><title>apply函数族入门</title><link>https://gewutang.cn/2011/11/09/apply-family/</link><pubDate>Wed, 09 Nov 2011 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2011/11/09/apply-family/</guid><description>&lt;p&gt;在任何一个R语言问答网站或者论坛，你都能看见这样的问题：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &#10; &lt;/blockquote&gt;&#10;&lt;p&gt;Q:如何用循环做【&amp;hellip;各种奇怪的事情&amp;hellip;】&#10;A:不用用循环哦，亲！apply函数可以解决这个问题哦，亲！&lt;/p&gt;&#10;&lt;p&gt;上面答案中提到的这个神奇的apply函数到底是什么？下面通过一些简单的操作示范一下。&lt;/p&gt;&#10;&lt;p&gt;打开R，敲入??apply函数，选定base包部分你会看到下面的东西：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;base::apply Apply Functions Over Array Margins&#10;base::by Apply a Function to a Data Frame Split by Factors&#10;base::eapply Apply a Function Over Values in an Environment&#10;base::lapply Apply a Function over a List or Vector&#10;base::mapply Apply a Function to Multiple List or Vector Arguments&#10;base::rapply Recursively Apply a Function to a List&#10;base::tapply Apply a Function Over a Ragged Array&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;下面一一示范。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;apply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;先看看帮助文档中对其的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“Returns a vector or array or list of values obtained by applying a function to margins of an array or matrix. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;好吧，vector、array和function是神马我都明白，margins是什么？我来翻译一下吧，margins为1时是指行，margins为2时是指列，如果是c(1:2)，好吧，这个啰嗦的举动，指的是整个array或者matrix。&lt;/p&gt;&#10;&lt;p&gt;例子如下:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#创建一个10行2列的矩阵&#10;m &amp;lt;- matrix(c(1:10,11:20),nrow=10,ncol=2)&#10;&#10;#求m的每一行的均值&#10;apply(m,1,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 6 7 8 9 10 11 12 13 14 15&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#求m的每一列的均值&#10;apply(m,2,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 5.5 15.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#将m的每个值除以2&#10;apply(m,1:2,function(x) x/2)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [,1] [,2]&#10;## [1,] 0.5 5.5&#10;## [2,] 1.0 6.0&#10;## [3,] 1.5 6.5&#10;## [4,] 2.0 7.0&#10;## [5,] 2.5 7.5&#10;## [6,] 3.0 8.0&#10;## [7,] 3.5 8.5&#10;## [8,] 4.0 9.0&#10;## [9,] 4.5 9.5&#10;## [10,] 5.0 10.0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;最后一个例子仅仅是为了示范，我们有更简单的方法一秒钟实现。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;m/2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [,1] [,2]&#10;## [1,] 0.5 5.5&#10;## [2,] 1.0 6.0&#10;## [3,] 1.5 6.5&#10;## [4,] 2.0 7.0&#10;## [5,] 2.5 7.5&#10;## [6,] 3.0 8.0&#10;## [7,] 3.5 8.5&#10;## [8,] 4.0 9.0&#10;## [9,] 4.5 9.5&#10;## [10,] 5.0 10.0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;by&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档中的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &#10; &lt;/blockquote&gt;&#10;&lt;p&gt;“Function by is an object-oriented wrapper for tapply applied to data frames. ”&lt;/p&gt;&#10;&lt;p&gt;事实上，by的功能绝不是这一句话所能描述的。接着读下去，你会看到&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“A data frame is split by row into data frames subsetted by the values of one or more factors, and function FUN is applied to each subset in turn. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这里，我们用一个带有定性变量的数据进行示范。这个数据集就是著名的iris。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;attach(iris)&#10;head(iris)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Sepal.Length Sepal.Width Petal.Length Petal.Width Species&#10;## 1 5.1 3.5 1.4 0.2 setosa&#10;## 2 4.9 3.0 1.4 0.2 setosa&#10;## 3 4.7 3.2 1.3 0.2 setosa&#10;## 4 4.6 3.1 1.5 0.2 setosa&#10;## 5 5.0 3.6 1.4 0.2 setosa&#10;## 6 5.4 3.9 1.7 0.4 setosa&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#根据Species分类，求前4个变量的均值&#10;by(iris[,1:4],Species,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Warning in mean.default(data[x, , drop = FALSE], ...):&#10;## 参数不是数值也不是逻辑值：返回NA&#10;## Warning in mean.default(data[x, , drop = FALSE], ...):&#10;## 参数不是数值也不是逻辑值：返回NA&#10;## Warning in mean.default(data[x, , drop = FALSE], ...):&#10;## 参数不是数值也不是逻辑值：返回NA&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Species: setosa&#10;## [1] NA&#10;## ------------------------------------------------------------ &#10;## Species: versicolor&#10;## [1] NA&#10;## ------------------------------------------------------------ &#10;## Species: virginica&#10;## [1] NA&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;其实，就是根据一个定性变量将数据分为若干个子集，再对各子集进行apply操作。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;eapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“eapply applies FUN to the named values from an environment and returns the results as a list. The user can request that all named objects are used (normally names that begin with a dot are not). The output is not sorted and no enclosing environments are searched. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;有理解这句话，重点是理解environment这个东西。environment相当于是R里面的一个小系统，这个系统包含有自己的变量和函数等内容。&lt;/p&gt;&#10;&lt;p&gt;用一个简单的例子来示范：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#创建一个新的environment&#10;e=new.env()&#10;#在e中创建两个变量&#10;e$a=1:10&#10;e$b=11:20&#10;#求e中变量的均值&#10;eapply(e,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 5.5&#10;## &#10;## $b&#10;## [1] 15.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;一般人儿可能不常用environment这个东西。不过，Bioconductor们是例外。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;lapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“lapply returns a list of the same length as X, each element of which is the result of applying FUN to the corresponding element of X. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这是apply函数的帮助文档中最简明扼要的一个。直接给示范：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#创建一个list&#10;l=list(a=1:10,b=11:20)&#10;#计算list中每个元素的均值&#10;lapply(l,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 5.5&#10;## &#10;## $b&#10;## [1] 15.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#计算list中每个元素的和&#10;lapply(l,sum)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 55&#10;## &#10;## $b&#10;## [1] 155&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;lapply的文档中让我们进一步参考sapply、vapply和replicate。那我们走去看看。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;sapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“sapply is a user-friendly version and wrapper of lapply by default returning a vector, matrix or, if simplify=&amp;ldquo;array&amp;rdquo;, an array if appropriate, by applying simplify2array(). sapply(x, f, simplify=FALSE, USE.NAMES=FALSE) is the same as lapply(x,f). ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;上面一堆简单说就是，lapply返回的是一个含有两个元素$a和$b的list，而sapply返回的是一个含有元素[[&amp;ldquo;a&amp;rdquo;]]和[[&amp;ldquo;b&amp;rdquo;]]的vector，或者列名为a和b的矩阵。&lt;/p&gt;&#10;&lt;p&gt;示范如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#创建一个list&#10;l=list(a=1:10,b=11:20)&#10;#用sapply求均值&#10;l.mean=sapply(l,mean)&#10;#观察返回结果的类型&#10;class(l.mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;numeric&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;l.mean[['a']]&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 5.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;vapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“vapply is similar to sapply, but has a pre-specified type of return value, so it can be safer (and sometimes faster) to use.”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;直接示范：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;l=list(a=1:10,b=11:20)&#10;#用vapply函数计算五分位数&#10;l.fivenum=vapply(l,fivenum,c(Min.=0,&amp;quot;lst Qu.&amp;quot;=0,Median=0,&amp;quot;3rd Qu.&amp;quot;=0,Max.=0))&#10;class(l.fivenum)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;matrix&amp;quot; &amp;quot;array&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#结果&#10;l.fivenum&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## a b&#10;## Min. 1.0 11.0&#10;## lst Qu. 3.0 13.0&#10;## Median 5.5 15.5&#10;## 3rd Qu. 8.0 18.0&#10;## Max. 10.0 20.0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;从结果可以看到，vapply返回的是一个矩阵。矩阵的列名是list的元素，行名取决于函数的输出结果。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;replicate&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述:&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“replicate is a wrapper for the common use of sapply for repeated evaluation of an expression (which will usually involve random number generation). ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;replicate是一个非常强大的函数，它有两个强制参数：replications,即操作的重复次数；function，及要重复的操作。还有一个可选择参数：simplify=T，是否将操作结果转化为vector或者matrix。&lt;/p&gt;&#10;&lt;p&gt;示范：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;replicate(10,rnorm(10))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [,1] [,2] [,3] [,4] [,5] [,6]&#10;## [1,] 0.09404565 0.6900446 0.20266413 0.5129547 1.0128168 0.05653415&#10;## [2,] -0.91284275 0.4148158 0.52344728 1.6220620 -0.1530737 0.05569266&#10;## [3,] -2.82534108 -0.8308159 -0.80378790 -0.4079487 -2.1890716 -0.63564857&#10;## [4,] -0.88857743 -0.3077837 -1.04967642 0.3230530 0.1094893 0.38889519&#10;## [5,] 0.21849109 1.2910931 -1.31689751 -0.8643641 -1.6985050 -0.72514369&#10;## [6,] 0.42406931 1.0962243 0.03433455 -0.3644647 -1.1519254 -0.51264405&#10;## [7,] -0.95389493 0.8339559 -0.48655834 0.0271446 0.8224275 -0.75322140&#10;## [8,] 1.30411129 0.6961557 -0.94826540 3.8187493 1.9491568 -0.70021472&#10;## [9,] 1.42619896 1.3484791 -1.77604799 0.2154067 0.3761675 -0.24362034&#10;## [10,] -0.12993140 0.2320959 -0.08696657 1.2382602 0.5781700 -1.26176561&#10;## [,7] [,8] [,9] [,10]&#10;## [1,] 0.29583451 1.7547814 -0.4761433 -2.9786950&#10;## [2,] -1.51743386 -2.1529347 0.3729536 0.2775196&#10;## [3,] -0.46015526 -0.7021302 -0.3539648 -0.6730854&#10;## [4,] 0.89778909 0.1765478 1.9319342 0.3784471&#10;## [5,] 1.42831439 -0.3437932 0.3734149 0.3974802&#10;## [6,] 0.07412502 -2.5053443 -1.0342991 0.8934034&#10;## [7,] 0.04454659 -0.1709211 -0.4627233 1.0121957&#10;## [8,] -0.46424059 -0.2812505 -0.3270812 0.2869938&#10;## [9,] 0.11599570 1.5177862 0.2759767 0.8952857&#10;## [10,] 0.59676528 -0.1538958 -0.9503086 -0.3969758&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;mapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“mapply is a multivariate version of sapply. mapply applies FUN to the first elements of each &amp;hellip; argument, the second elements, the third elements, and so on. Arguments are recycled if necessary. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;如果你认真看看mapply的帮助文档的话，我打赌你会看到头大。这里给看官两个简单的例子：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;l1=list(a=1:10,b=11:20)&#10;l2=list(c=21:30,d=31:40)&#10;l1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 1 2 3 4 5 6 7 8 9 10&#10;## &#10;## $b&#10;## [1] 11 12 13 14 15 16 17 18 19 20&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;l2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $c&#10;## [1] 21 22 23 24 25 26 27 28 29 30&#10;## &#10;## $d&#10;## [1] 31 32 33 34 35 36 37 38 39 40&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#计算l1,l2中各元素的和&#10;mapply(sum,l1$a,l1$b,l2$c,l2$d)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 64 68 72 76 80 84 88 92 96 100&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;竖直看下来，加总就得到了上面的结果。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;rapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“rapply is a recursive version of lapply. ”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这个描述是史上最差描述之一。因为rapply跟recursive并没有太大关系。rapply的创造性在于提供了一个结果输出形式的参数。&lt;/p&gt;&#10;&lt;p&gt;示范：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#创建list&#10;l=list(a=1:10,b=11:20)&#10;#计算l中元素的log2&#10;rapply(l,log2)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## a1 a2 a3 a4 a5 a6 a7 a8 &#10;## 0.000000 1.000000 1.584963 2.000000 2.321928 2.584963 2.807355 3.000000 &#10;## a9 a10 b1 b2 b3 b4 b5 b6 &#10;## 3.169925 3.321928 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 &#10;## b7 b8 b9 b10 &#10;## 4.087463 4.169925 4.247928 4.321928&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#将结果的输出形式设定为list&#10;&#10;rapply(l,log2,how=&amp;quot;list&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 0.000000 1.000000 1.584963 2.000000 2.321928 2.584963 2.807355 3.000000&#10;## [9] 3.169925 3.321928&#10;## &#10;## $b&#10;## [1] 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 4.087463 4.169925&#10;## [9] 4.247928 4.321928&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#计算均值&#10;rapply(l,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## a b &#10;## 5.5 15.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rapply(l,mean,how=&amp;quot;list&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## $a&#10;## [1] 5.5&#10;## &#10;## $b&#10;## [1] 15.5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;综上，rapply函数的输出结果取决于函数和how参数。当how=&amp;ldquo;list&amp;quot;时，数据的原始结构被保留，否则，输出结果被转化为vector。&lt;/p&gt;&#10;&lt;p&gt;当然，看官还可以将classes函数传递给rapply函数。例如在混合型list中，可以通过classes=numeric，是的函数子对数字型元素进行操作。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;tapply&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;帮助文档的描述：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;“Apply a function to each cell of a ragged array, that is to each (non-empty) group of values given by a unique combination of the levels of certain factors.”&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;语焉不详。翻译一下大概是：&lt;/p&gt;&#10;&lt;p&gt;“tapply(X, INDEX, FUN = NULL, &amp;hellip;, simplify = TRUE)”中的“X”是&#10;“an atomic object, typically a vector.”，而“INDEX”是“list of factors, each of same length as X. The elements are coerced to factors by as.factor.”&lt;/p&gt;&#10;&lt;p&gt;依然以iris数据集为例示范一下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;attach(iris)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following objects are masked from iris (pos = 3):&#10;## &#10;## Petal.Length, Petal.Width, Sepal.Length, Sepal.Width, Species&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;#根据sprcies进行分类，计算petal的均值&#10;tapply(iris$Petal.Length,Species,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## setosa versicolor virginica &#10;## 1.462 4.260 5.552&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;简短的总结：&lt;/p&gt;&#10;&lt;p&gt;这里给出的都是极其简单的例子，基于最简单的数据，和最简单的函数。因为对于每一个操作而言，看官都可查看数据的操作前状态和操作后状态，这样便于看官知道，操作到底对数据干了什么事情。&lt;/p&gt;&#10;&lt;p&gt;当然了，apply函数的功能不限于文中介绍的这些，进一步的功用期待看官自己去挖掘。&lt;/p&gt;&#10;&lt;p&gt;给出几个使用apply函数的建议，在使用之前应当思考：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;原始数据是什么类型？vector?matrix?data frame?&amp;hellip;.&lt;/li&gt;&#10;&lt;li&gt;想对原始数据的哪些子集进行操作？行?列？所有元素？&amp;hellip;.&lt;/li&gt;&#10;&lt;li&gt;操作将返回什么结果？原始数据的结构是如何变化的？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;只是一个老生常谈的关于“输入——操作——输出”的故事：你有什么？你想要什么？两者之间需要什么？&lt;/p&gt;&#10;</description></item></channel></rss>