学习R语言半年多了,以前比较注重统计方法上的学习,但是最近感觉一些基础知识也很重要。去年的参考资料是《R语言实战》,今年主要是看视频。推荐网易云课堂里的教程,很多资料都是很良心的~
目前学习的是:R语言数据分析挖掘实战,讲的很全,从基础知识到R语言机器学习的应用。
(我是先从后面机器学习开始学的,发现老师在里面用到很多自定义函数、循环,以前在书上看到这些也没有实际操作过,所以赶紧看前面的视频补补课)
今天的例子都很简单啦...
1、while循环
s<-1 i<-0 while(i<=100) { s<-s+i i<-i+1 } s
while(1/prod(1:i)-1/prod(1:(i+1))>0.001) { print(i) e<-e+1/prod(1:i) i<-i+1 } e #添加print(i),可以看出具体的i值
2、for循环
a<-c(1,2,3,4,1) for(i in c(1:length(a))) { print(i) } #打印序号 a<-c(1,2,3,4,1) for(i in a) { print(a[i]) } #打印元素 #or a<-c(1,2,3,4,1) for(i in a) { print(i) }
mat<-as.data.frame(diag((9))) for(i in 1:9) { for(j in 1:9) if(i>=j) { mat[i,j]=paste(i,"*",j,"=",i*j) } else{mat[i,j]=""} } mat #打印99乘法表
打印出来的乘法表:
> mat V1 V2 V3 V4 V5 V6 V7 V8 V9 1 1 * 1 = 1 2 2 * 1 = 2 2 * 2 = 4 3 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 4 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 5 5 * 1 = 5 5 * 2 = 10 5 * 3 = 15 5 * 4 = 20 5 * 5 = 25 6 6 * 1 = 6 6 * 2 = 12 6 * 3 = 18 6 * 4 = 24 6 * 5 = 30 6 * 6 = 36 7 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 8 8 * 1 = 8 8 * 2 = 16 8 * 3 = 24 8 * 4 = 32 8 * 5 = 40 8 * 6 = 48 8 * 7 = 56 8 * 8 = 64 9 9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
3、循环嵌套
b<-matrix(c(1:24),4) for(i in c(1:nrow(b))) for(j in c(1:ncol(b))) { print(b[i,j]) }
b
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 5 9 13 17 21
[2,] 2 6 10 14 18 22
[3,] 3 7 11 15 19 23
[4,] 4 8 12 16 20 24
返回的是这样的:
[1] 1 #a11
[1] 5 #a12
[1] 9
[1] 13
[1] 17
[1] 21
[1] 2 #a21
[1] 6
[1] 10
[1] 14
[1] 18
[1] 22
[1] 3
[1] 7
[1] 11
[1] 15
[1] 19
[1] 23
[1] 4
[1] 8
[1] 12
[1] 16
[1] 20
[1] 24
4、repeat()函数
s<-0 i<-1 repeat{ if(i>100){break()} #break()即推出循环 s<-s+i i<-i+1 } s #repeat()
5、自定义一个计算矩阵乘积的函数
mat1<-matrix(c(1:12),nrow = 3,ncol = 4);mat1 mat2<-matrix(c(1:24),nrow = 4,ncol = 6);mat2 f<-function(x,y) { xcol<-dim(x)[2] yrow<-dim(y)[1] m<-dim(x)[1] n<-dim(y)[2] if(xcol!=yrow) #向量乘积的要求 { print("error") return(0) } else #if...else语句 { mat<-matrix(0,nrow=dim(x)[1],ncol=dim(y)[2]) #首先要定义一个矩阵作为结果矩阵 for(i in c(1:m)) for(j in c(1:n)) mat[i,j]<-sum(x[i,]*y[,j]) return(mat) } } f(mat1,mat2) mat1%*%mat2 #验证函数,bingo
6、管道函数%>%
用法
a%>%b等价于f(a,b)
a %>%f(a,.,c)等价于f(a,b,c)【里面是.,看清楚!】
一个简单的栗子
plus<-function(x,y,z) { return(x*y+z) } plus(2,3,4) 3%>%plus3(2,.,4)
计算f(x)=sin(x+1)^2在x=4的值
x<-4 a<-x+1 b<-a^2 d<-sin(b) d #利用管道函数: f1<-function(x){return(x+1)} f2<-function(x){return(x^2)} f3<-function(x){return(sin(x))} x%>%f1()%>%f2()%>%f3()
再来一个栗子,把时间变成这样的: "2018-05-02 19:50:02”
先定义一个随机的时间矩阵:
data<-as.Date("2017-5-2");data hour<-sample(1:24,15) min<-sample(1:60,15) second<-sample(1:60,15) dat<-data.frame(data,hour,min,second)
> dat data hour min second 1 2017-05-02 3 45 41 2 2017-05-02 17 47 29 3 2017-05-02 23 36 55 4 2017-05-02 7 23 5 5 2017-05-02 2 5 35 6 2017-05-02 19 2 48 7 2017-05-02 15 49 6 8 2017-05-02 4 52 13 9 2017-05-02 5 30 36 10 2017-05-02 14 9 23 11 2017-05-02 11 38 18 12 2017-05-02 8 39 7 13 2017-05-02 16 22 33 14 2017-05-02 20 58 40 15 2017-05-02 21 35 57
利用到一个包,里面一个函数unite,有个小示范
library(tidyr)
a<-data.frame(a1=c(1:3),a2=c(1:3));a unite(a,a12,a1,a2,sep="|_|") #将矩阵a里的a1列和a2列通过|_|连接成新列a12
a<-data.frame(a1=c(1:3),a2=c(1:3));a a1 a2 1 1 1 2 2 2 3 3 3
变成了这样
a12 1 1|_|1 2 2|_|2 3 3|_|3
下面可以用管道函数转变时间的显示啦:
dat%>%unite(datahour,data,hour,sep=" ")%>%unite(datatime,datahour,min,second,sep=":")
结果是这样:
datatime 1 2017-05-02 3:45:41 2 2017-05-02 17:47:29 3 2017-05-02 23:36:55 4 2017-05-02 7:23:5 5 2017-05-02 2:5:35 6 2017-05-02 19:2:48 7 2017-05-02 15:49:6 8 2017-05-02 4:52:13 9 2017-05-02 5:30:36 10 2017-05-02 14:9:23 11 2017-05-02 11:38:18 12 2017-05-02 8:39:7 13 2017-05-02 16:22:33 14 2017-05-02 20:58:40 15 2017-05-02 21:35:57 >