学习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
>
来源:oschina
链接:https://my.oschina.net/u/4384347/blog/3988471