应用,SpEpple,在R中应用

December 18,二千零一十二
通过

(本文首次发表于 流沙,并对 188bet appR博主

这是关于使用apply的介绍性文章,金宝搏网址多姿多彩,最适合对R比较陌生或不熟悉这些功能的人。There is a part 2 coming that will look at density plots with ggplot,但首先我想我会进行一个切线,给出一些apply家族的例子,因为他们经常和R合作。
我在一个数据集中比较了三种方法。A sample from the data set was generated,对该子集应用了三种不同的方法。我想看看他们的结果有什么不同。
我会运行返回矩阵的测试工具。The columns values were the metric used for evaluation of each method,行是给定子集的结果。我们有三列,one for each method,比如说30排,代表了三种方法所适用的30个不同的子集。
看起来有点像这样
方法1方法2方法3
[1,] 0.05517714 0.014054038 0.017260447
[2,] 0.08367678 0.003570883 0.004289079
[3,] 0.05274706 0.028629661 0.071323030
[4,]0.06769936 0.048446559 0.057432519
[5,] 0.06875188 0.019782518 0.080564474
[6,] 0.04913779 0.100062929 0.102208706
我们可以用 范数,to create three sets of observations.The first has mean 0,second mean of 2,平均值的三分之一,有30排。
m <- matrix(data=cbind(rnorm(30,0)rnorm(30,2)rnorm(30,5)),nRe= 30,ncol=3)

应用

我们什么时候使用Apply?When we have some structured blob of data that we wish to perform operations on.这里的结构意味着某种形式的矩阵。操作可能是信息性的,或者改变,subsetting,whatever to the data.

正如一位评论家指出的那样,if you are using a data frame the data types must all be the same otherwise they will be subjected to type conversion.This may or may not be what you want,if the data frame has string/character data as well as numeric data,数字数据将转换为字符串/字符,数字操作可能无法提供您所期望的。

不用说,在R工作时,这种情况经常发生,所以花点时间熟悉 应用对我们的工作效率有很大的好处。
哪种实际的应用功能以及需要哪种特定的白炽灯取决于您的数据,the function you wish to use,你希望最终结果是什么样的。希望在这些例子的最后,正确的选择应该更清楚一些。
首先,我要确保我正确地创建了矩阵,三列,每列平均值为0,分别为2和5。我们可以使用 应用and the base 意思是用于检查此项的函数。
We tell 应用用第二个参数按行或按列遍历。在这种情况下,我们希望在最后得到三个数字,每列的平均值,所以告诉 应用通过将2作为第二个参数来沿着列工作。But let's do it wrong for the point of illustration:
应用,1,mean)
# [1] 2.408150 2.709325 1.718529 0.822519 2.693614 2.259044 1.849530 2.544685 2.957950 2.219874
#[11] 2.582011 2.471938 2.015625 2.101832 2.189781 2.319142 2.504821 2.203066 2.280550 2.401297
#[21]2.312254 1.833903 1.900122 2.427002 2.426869 1.890895 2.515842 2.363085 3.049760 2.027570
在第二个参数中传递1,我们得到30个值,给出每行的平均值。Not the three numbers we were expecting,再试一次。
应用,2,mean)
# [1]-0.02664418 1.95812458 4.86857792
伟大的。We can see the mean of each column is roughly 0,2,and 5 as we expected.

我们自己的功能

假设我看到那个负数,意识到我只想看正数。Let's see how many negative numbers each column has,再次使用应用:
应用,2,function(x) length(x[x<0]))
#[1] 14  1  0
So 14 negative values in column one,1第二列中的负值,and none in column three.在给定平均值和sd为1的情况下,我们对三个正态分布的期望或多或少。
Here we have used a simple function we defined in the call to 应用,rather than some built in function.注意,我们没有为函数指定返回值。r将神奇地返回最后一个评估值。实际函数使用子集提取 x小于0,然后计算还有多少人在使用 length.
函数接受一个参数,which I have arbitrarily called x.在这种情况下 xwill be a single column of the matrix.它是一个1列矩阵还是一个向量?让我们看看:
应用,2,function(x) is.matrix(x))
#[1] FALSE FALSE FALSE
不是矩阵。这里不需要函数定义,我们可以通过 is.matrix函数,as it only takes one argument and has already been wrapped up in a function for us.让我们检查一下,它们是我们所期望的向量。
应用,2,是向量
#[1] TRUE TRUE TRUE

Why then did we need to wrap up our length function?When we want to define our own handling function for apply,我们必须至少为输入的数据命名,so we can use it in our function.
应用,2,长度(x[x<0)]
#Error in match.fun(FUN) : object ‘x' not found
我们指的是一些价值 x在函数中,但是R不知道它在哪里,所以给了我们一个错误。这里还有其他力量在发挥作用,但为了简单起见,只需记住在函数中包装任何代码。For example,让我们只看正值的平均值:
应用,2,function(x) mean(x[x>0]))
#[1]0.4466368 2.0415736 4.8685779

使用工整的和重叠的


这两种功能的工作方式相似,traversing over a set of data like a list or vector,and calling the specified function for each item.
有时我们需要以一种小于线性的方式遍历数据。假设我们想将当前观察值与之前的5个周期值进行比较。Use can probably use rollapply为此(通过Quantmod)但一个快速而肮脏的方法是 斯普林特勒普传递一组索引值。
Here we will use 斯普林特,在数据列表或向量上工作。
sapply(1:3,function(x) x^2)
#[1] 1 4 9
勒普非常相似,但是,它将返回一个列表而不是向量:
LIAPE(1:3)function(x) x^2)
〔1〕
α〔1〕1
γ
#[[2]]
α〔1〕4
γ
#[[3]]
#[1] 9
Passing 简化=假to 斯普林特will also give you a list:
sapply(1:3,函数(x)x^2,简化=f)
〔1〕
α〔1〕1
γ
#[[2]]
α〔1〕4
γ
#[[3]]
#[1] 9
And you can use 未列出的具有 勒普得到一个向量。
不列出(重叠(1:3,function(x) x^2))
#[1] 1 4 9
However the behviour is not as clean when things have names,所以最好使用 斯普林特勒普as makes sense for your data and what you want to receive back.If you want a list returned,使用 勒普 .If you want a vector,使用 斯普林特 .

肮脏事迹


Anyway,一个卑鄙的伎俩是通过 斯普林特a vector of indexes and write your function making some assumptions 金宝搏网址about the structure of the underlying data.让我们看看 意思是再次示例:
sapply(1:3,函数(x)平均值(m[,x]))
[1]-0.02664418 1.95812458 4.86857792
我们将列索引(1,2,3)传递给函数,假设一些变量 有我们的数据。Fine for quickies but not very nice,很可能会变成一枚可维护性炸弹。
我们可以通过将参数中的数据传递给函数来稍微整理一下,并使用 所有APPLY函数都具有用于传递额外参数的特殊参数:
sapply(1:3,function(x,y)平均(y [,x]),y=m)
# [1]-0.02664418 1.95812458 4.86857792
这次,我们的函数有两个参数, xY.这个 x变量将和以前一样,whatever 斯普林特is currently going through.这个 Yvariable we will pass using the optional arguments to 斯普林特.
在这种情况下,我们已经通过了 ,显式命名 Yargument in the 斯普林特call.不是严格必要的,但它使代码的读取和维护更加容易。这个 Y每个调用的值都相同 斯普林特使我们的功能。
I don't really recommend passing the index arguments like this,它很容易出错,对其他阅读您的代码的人来说很容易混淆。
我希望你发现这些例子有帮助。Please check out part 2 where we create a density plot of the values in our matrix.

To leave a comment作者,please follow the link and comment on their blog: 流沙.

188bet appR博客offers 每日电子邮件更新金宝搏网址 Rnews and tutorials关于以下主题: 数据科学大数据, r作业,可视化(可视化) ggplot2Boxplots地图动画)程序设计(程序) 演播室SweaveLaTeXSQL日食吉特哈多普Web Scraping)统计 regression主成分分析时间序列trading还有更多…



如果你走这么远,why not 订阅更新 from the site?Choose your flavor: e-mailtwitter1188bet app,或 脸谱网...

Comments are closed.

Search 188bet appR-bloggers


赞助商

千万不要错过更新!
Subscribe to 188bet appR-bloggers接收
e-mails with the latest R posts.
(您将不再看到此消息。)

单击此处关闭(此弹出窗口将不再出现)