R语言(自定义函数、循环语句、管道函数)

学习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
> 

 

posted @ 2018-05-02 20:28  ZhengXixide  阅读(10773)  评论(0编辑  收藏  举报