37.R中向量化初步
由于R是用向量化的,就像MATLAB用矩阵一样.
首先上代码,R中的向量化和矩阵操作的例子:
R>a=matrix(1:4,2)<br />
R>b=matrix(2:5,2)<br />
R>a<br />
[,1] [,2]<br />
[1,] 1 3<br />
[2,] 2 4<br />
R>b<br />
[,1] [,2]<br />
[1,] 2 4<br />
[2,] 3 5<br />
R>a*b<br />
[,1] [,2]<br />
[1,] 2 12<br />
[2,] 6 20<br />
R>a%*%b<br />
[,1] [,2]<br />
[1,] 11 19<br />
[2,] 16 28<br />
R>a*2<br />
[,1] [,2]<br />
[1,] 2 6<br />
[2,] 4 8<br />
R>a^2<br />
[,1] [,2]<br />
[1,] 1 9<br />
[2,] 4 16<br />
可以看到不同于MATLAB的.*,*这里大家要小心注意.
很多函数可以自动把参数当作向量(也许理解有错),但有些不行:
R>sum(1,2,3)<br />
[1] 6<br />
R>mean(1,2,3)<br />
[1] 1<br />
R>mean(c(1,2,3))<br />
[1] 2<br />
R>
如果把if向量化:
R>x=1;<br />
R>if(x<0) y=1 else y=-1<br />
R>y<br />
[1] -1<br />
R>x=1:3;<br />
R>if(x<0) y=1 else y=-1<br />
Warning message:<br />
In if (x < 0) y = 1 else y = -1 :<br />
the condition has length > 1 and only the first element will be used<br />
R>y=ifelse(x<0,1,-1)<br />
R>y<br />
[1] -1 -1 -1<br />
以及谈到apply系列避免循环,R神曲中说,apply系列定义的时候里面是有循环的。。。。
最后给个比较好的例子,有深度了
<br />
x[is.na(x)]=0<br />
#在矩阵X很大的时候,但行数比列数多的多的时候来的没有下面的方法快<br />
for(i in ncol(x)) x[is.na(x[,i]),i]=0 #我想类似的道理可以用在那些90W行30多列的矩阵中
还有一些注意的:
x=matrix(1:9,3)<br />
apply(x,2,sum)<br />
#与colSums(x)一样,类似的还有rowMeans(x)
PS:这部分我个人感觉比较琐碎,因为我本人到现在也还是没有真正理解到底向量化快还是不快,以及什么时候用了向量化,什么时候没用等问题。。。。不过上面的几点可能都是我们要注意的
再补充下:数据框data.frame它的primary是list,matrix 和 array 的primary的vector,factor的primary是integer,而data.frame,matrix,array,factor都是object,数据框是广义的矩阵,矩阵是特殊的数组。。
有点头晕。。但是你如果你看过前面的S3 classes也许容易理解一些
</p>