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
> 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM