1. 程式人生 > >R語言第二章 陣列、陣列框、文字讀、迴圈語句使用

R語言第二章 陣列、陣列框、文字讀、迴圈語句使用

R語言

一、陣列

> x=c(1:6)

> x

[1] 1 2 3 4 5 6

> is.vector(x)                                      #判斷x是一個向量

[1] TRUE

> is.array(x)                                        #判斷x不是一個數組

[1] FALSE

> dim(x) <-c(2,3)                                #使用dim (x)賦值一個(2,3)陣列

> x

    [,1] [,2] [,3]

[1,]   1    3    5

[2,]   2    4    6

> is.array(x)                                        #再次判斷x是否是陣列

[1] TRUE

> is.matrix(x)                                      #判斷x是否是矩陣(注意:矩陣是陣列的特殊情況)

[1] TRUE

二、資料框

資料框和矩陣的區別是:資料框是有字元和數字組成的,而矩陣全是數字組成的。

在統計學了,資料框更能體現它的樣子。

在這裡可以資料組成一個數據框使用data.frame(x1,x2)函式來指定x1 and x2兩個向量,

向量可以是字元型和數字型。(注意:x1 and x2向量的長度必須相等 )

可以使用(x=data.frame(‘重量’=x1,’運費’=x2)) 來替換x1 and x2的列頭,相當於sql語句中的

欄位的別名。(注意:跟sql不一樣的地方是它是直接替換掉了,但sql只是個別名)

三、畫散點圖

函式plot()

這個函式主要的作用是用來畫圖的。(在後續講解)

四、讀文字檔案資料

函式 read.table()

>(X=read.table("/root/R/2/abc"))

  V1V2

1 176 85

2 168 80

3 156 60

4 167 60

5 170 90

6 171 95

讀剪下板操作

> y<-read.table("/root/R/2/abc",header=F)             #header是不讀列頭

> y

  V1V2

1 176 85

2 168 80

3 156 60

4 167 60

5 170 90

6 171 95

讀excel檔案資料另類方法

1、 先安裝ODBC源

apt-get installunixodbc unixodbc-dev

2、安裝JDK包

1、建立java目錄

mkdir /usr/java

2、解壓包到/usr/java

tar –zxvf jdk-8u91-linux-x64.gz

3、在/etc/profile 檔案下建立java環境變數(注意:在尾部加入,重啟系統生效)

JAVA_HOME=/usr/java/jdk1.8.0_91

PATH=$PATH:$JAVA_HOME/bin

CLASSPATH=.:$JAVA_HOME/lib

export JAVA_HOME

export PATH

export CLASSPATH

2、 安裝rjava包和xlsx包

執行命令:R CMD javareconf

[email protected]:/usr/java#R CMD javareconf

Java interpreter: /usr/java/jdk1.8.0_91/jre/bin/java

Javaversion     : 1.8.0_91

Java homepath   : /usr/java/jdk1.8.0_91

Javacompiler    : /usr/java/jdk1.8.0_91/bin/javac

Java headersgen.: /usr/java/jdk1.8.0_91/bin/javah

Java archivetool: /usr/java/jdk1.8.0_91/bin/jar

trying tocompile and link a JNI program

detected JNI cppflags    : -I$(JAVA_HOME)/include-I$(JAVA_HOME)/include/linux

detected JNIlinker flags : -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm

gcc -std=gnu99-I/usr/share/R/include -DNDEBUG -I/usr/java/jdk1.8.0_91/include-I/usr/java/jdk1.8.0_91/include/linux    -fpic  -g -O2-fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c conftest.c -o conftest.o

gcc -std=gnu99-shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o conftest.soconftest.o -L/usr/java/jdk1.8.0_91/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib-lR

JAVA_HOME        : /usr/java/jdk1.8.0_91

Java librarypath: $(JAVA_HOME)/jre/lib/amd64/server

JNI cppflags    : -I$(JAVA_HOME)/include-I$(JAVA_HOME)/include/linux

JNI linker flags: -L$(JAVA_HOME)/jre/lib/amd64/server -ljvm

Updating Javaconfiguration in /usr/lib/R

Done.

進入R語言環境安裝rjava和xlsx包

         install.packages("rJava")

         install.packages("xlsx")

         安裝順利的話就結束了

3、 使用read.xlsx() 函式讀xlsx檔案

>read.xlsx(file="/root/R/02/text.xlsx",header=T,sheetIndex=1)

  X170 X45

1  165  80

2  168  70

3  169  85

五、迴圈語句

For語句

> a <-c(1,59)                                               #將向量1到59賦值給a

> for (i in 1:59) {a[i]=i*2+3}                     #迴圈執行1到59的值,每次值*2+3

> a

 [1]  5   7   9 11  13  15 17  19  21 23  25  27 29  31  33 35  37  39  41

[20] 43  45  47 49  51  53 55  57  59 61  63  65 67  69  71 73  75  77  79

[39] 81  83  85 87  89  91 93  95  97  99101 103 105 107 109 111 113 115 117

[58] 119 121

While語句

> a[1]=5                                                      

> i=1

> while (a[i]<121){i=i+1;a[i]=a[i-1]+2} #滿足a的值小於121才能進入迴圈體執行

> a

 [1]  5   7   9  11 13  15  17 19  21  23 25  27  29 31  33  35 37  39  41

[20] 43  45  47 49  51  53 55  57  59 61  63  65 67  69  71 73  75  77  79

[39] 81  83  85 87  89  91 93  95  97  99101 103 105 107 109 111 113 115 117

[58] 119 121

六、執行R指令碼

使用函式source() 、print()

[email protected]:~/R/02#cat text.r

a <- c(1,59);

a[1]=5;

i=1;

while(a[i]<121) {i=i+1;a[i]=a[i-1]+2};

print(a);

七、綜合性例子

模擬產生統計專業同學的名單(學號區分),記錄數學分析,線性代數,概率統計十三科成績,然後進行一些統計分析

>num=seq(10378001,10378100)                   #代表100個學號

> num

  [1] 10378001 10378002 10378003 1037800410378005 10378006 10378007 10378008

  [9] 10378009 10378010 10378011 1037801210378013 10378014 10378015 10378016

 [17] 10378017 10378018 10378019 1037802010378021 10378022 10378023 10378024

 [25] 10378025 10378026 10378027 1037802810378029 10378030 10378031 10378032

 [33] 10378033 10378034 10378035 1037803610378037 10378038 10378039 10378040

 [41] 10378041 10378042 10378043 1037804410378045 10378046 10378047 10378048

 [49] 10378049 10378050 10378051 1037805210378053 10378054 10378055 10378056

 [57] 10378057 10378058 10378059 1037806010378061 10378062 10378063 10378064

 [65] 10378065 10378066 10378067 1037806810378069 10378070 10378071 10378072

 [73] 10378073 10378074 10378075 1037807610378077 10378078 10378079 10378080

 [81] 10378081 10378082 10378083 1037808410378085 10378086 10378087 10378088

 [89] 10378089 10378090 10378091 1037809210378093 10378094 10378095 10378096

 [97] 10378097 10378098 10378099 10378100

使用runif和rnorm 函式

ruif() 函式是均勻分佈函式

>x1=round(runif(100,min=80,max=100)) 

#使用均勻分佈100個元素,下線是80 ,上線是100,最後四捨五入

> x1

  [1] 88  83  83 95  92  97 91  99  93 95  85  99 85  90  86 87  91  98

 [19] 83  99  90 82  80  89 92  85  80 90  80 100  86 93  99  80 87  93

 [37] 96  88  96  96  91 95  83  88 95  93  91 86  85  85 93  82  97  89

 [55] 96  83  85 95  87  83 88  90  98 96  95  86 84  95  92 92  86  82

 [73] 90  96  87 93  87  91 80  86  92 81  81  95 95  97  93 83  98  90

 [91] 100 96  95  87 90  93  86 89  95  87

rnorm() 函式是正太分佈函式

>x2=round(rnorm(100,mean=80,sd=7))  

#正太分佈100個元素,平均值是80分,標準差是7,最後四捨五入

> x2

  [1] 75  77  78 96  86  80 73  78  84 88  72  77 73  71  75 63  84  77

 [19] 65  75 100  84 76  87  73 74  83  80 72  76  71 76  95  94 79  74

 [37] 81  89  75 77  80  69 74  73  89 74  90  83  76  67 69  77  82  83

 [55] 76  89  74 74  82  73 86  80  69 82  72  78 85  74  77 86  71  86

 [73] 80  83  75 71  74  87 82  80  85 81  80  74 78  77  94 71  72  78

 [91] 88  76  76 89  88  73 74  80  89  75

>x3=round(rnorm(100,mean=83,sd=18))

#正太分佈100個元素,平均值是83,標準差是18,最後四捨五入

(注意:正太分佈沒有上線跟下線的概念,而這裡只有平均值和標準差,所以這裡超出100)

> x3

  [1] 65  97  73 81  85 122  74 92  87 103  52 78  66  81 121 97 118  90

 [19]  64104  90 100  73 83  67  97 77  79  68 110 121 72  85  91  73142

 [37] 86  78  90 70  72  98 100 99  26  91 68  82  80  68109  78 63  89

 [55] 82  83 109  64  69118  93 87 103  94  92 84  75  72 88  62 102  79

 [73] 63  87  88  96100 111  51  64 106 108 73  69 101  80 112 49 109 100

 [91] 82  66  47 53  67  89 70  75  69  77

>x3[which(x3>100)]=100   #把超過100分的值全部替換成100

> x3

  [1]  65 97  73  81  85100  74 92  87 100  52 78  66  81 100 97 100  90

 [19]  64100  90 100  73 83  67  97 77  79  68 100 100 72  85  91  73100

 [37] 86  78  90 70  72  98 100 99  26  91 68  82  80  68100  78 63  89

 [55] 82  83 100  64  69100  93 87 100  94  92 84  75  72 88  62 100  79

 [73] 63  87  88  96100 100  51  64 100 100 73  69 100  80 100 49 100 100

 [91] 82  66  47 53  67  89 70  75  69  77

合成數據框並儲存到硬碟上

使用的函式是data.frame() 、write.table()

>x=data.frame(num,x1,x2,x3)               #使用資料框進行輸出值

> x

         num x1  x2  x3

1   10378001 88  75  65

2   10378002 83  77  97

3   10378003 83  78  73

4   10378004 95  96  81

5   10378005 92  86  85

6   10378006 97  80 100

7   10378007 91  73  74

8   10378008 99  78  92

9   10378009 93  84  87

>write.table(x,file="/root/R/02/mark.txt",col.names=F,row.names=F,sep="")

使用write.table函式將data.frame(num,x1,x2,x3)寫入到/root/R/02/mark.txt檔案中

計算各科平均分

使用函式mean()、colMeans()、apply()

>mean(x)                 #算出各科的平均值

num                       x1          x2          x3

10378050.50       90.88       88.56       89.10

>colMeans(x)          #對列求平均值

num                       x1            x2          x3

10378050.50       89.88       78.56       79.10

> colMeans(x)[c("x1","x2","x3")]                  #求出x1,x2,x3的平均值,學號去除

x1        x2      x3

89.88  78.56 79.10

>apply(x,2,mean)                            

#在x框上對列做平均值

(注意:“2”表示在列上做平均值,“1”表示行)

num                          x1         x2          x3

10378050.50      89.88       78.56       79.10

> apply(x,2,max)            #在列上求最大值(最高分)

num                  x1      x2       x3

10378100     100       96     100

> apply(x,2,min)               #在列上求最小值(最低分)

num                 x1      x2       x3

10378001       81       58      28

> apply(x[c("x1","x2","x3")],1,sum)

#先把x1,x2,x3值取出後,在每一行值算出和

  [1] 275 260 231 259 253 251253 225 265 271 228 276 265 237 252 239 240 280

 [19] 234 277 244 252 263 242282 270 241 283 233 240 226 222 241 250 275 221

 [37] 244 265 244 230 208 267229 250 275 267 207 262 233 280 218 263 222 266

 [55] 240 224 259 236 249 226256 262 232 249 255 233 244 260 271 244 228 198

 [73] 215 258 226 242 260 237227 276 272 262 261 271 244 253 247 250 226 227

 [91] 265 217 221 260 238 244237 242 261 263