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