1. 程式人生 > >R語言-陣列與資料框操作

R語言-陣列與資料框操作

1、 陣列基本的操作:

1) 、檢視陣列---直接呼叫陣列名回車;

2) 、按照下標獲取陣列元素---呼叫陣列名+方括號+元素下標;

3)、檢視陣列長度(length());

4)、檢視陣列元素型別(mode();  ps:語言只支援陣列元素單一型別,及所有元素要麼都是字元,要麼都是數值)

5)、對陣列的操作還包括多個數組的包括,可以將兩個陣列組合成一個矩陣(R語言稱之為資料框:frame),可以將陣列按照行向量組合rbind()和列方向的組合cbind();

> x1=c(1,2,3,4,5)
> x2=c('1','2','3','4','5')
> x1
[1] 1 2 3 4 5
> x1[4]
[1] 4
> x2
[1] "1" "2" "3" "4" "5"
> x2[4]
[1] "4"
> length(x1)
[1] 5
> mode(x1)
[1] "numeric"
> mode(x2)
[1] "character"
> m1<-rbind(x1,x2)
> m1
   [,1] [,2] [,3] [,4] [,5]
x1 "1"  "2"  "3"  "4"  "5" 
x2 "1"  "2"  "3"  "4"  "5" 
> m2<-cbind(x1,x2)
> m2
     x1  x2 
[1,] "1" "1"
[2,] "2" "2"
[3,] "3" "3"
[4,] "4" "4"
[5,] "5" "5"</span>

2、有關陣列的統計指標處理:

常見的統計指標包括:平均值(mean())、求和(sum())、連乘(prod())、最值(min()、max())、方差(var())、標準差(sd())

首先我們先借助R的快速生成陣列函式c(startNum:endNum)生成1到100個數字並存放於陣列y內,然後對其進行相應統計指標輸出,具體見下圖:

> y<-c(1:100)
> mean(y)
[1] 50.5
> sum(y)
[1] 5050
> prod(y)
[1] 9.332622e+157
> max(y)
[1] 100
> min(y)
[1] 1
> var(y)
[1] 841.6667
> sd(y)
[1] 29.01149

3、 關於資料下標的相關處理

R語言提供了實用的下標處理函式,我們可以方便的取出理想資料,例如:

1)、取連續下標的元素;

2)、按照其他陣列元素的值取---以其他陣列元素的值取出相應本陣列對應下標的元素;

3)、按照元素值的大小取,如可以去除陣列中大於某個數的所有元素,小於某個數的所有元素等等;

4)、實用的which函式,which在陣列下標中代表該陣列物件,可以通過which取出陣列元素a[which()],相應的也可以取出符合元素的下標which();

5)、自排序函式(sort())和陣列反轉函式(rev());

<span style="font-weight: normal;"><span style="font-size:14px;">a=c(1,2,3,4,5,8,9,10,15555)
> a[1:5]
[1] 1 2 3 4 5
> a[a<5]
[1] 1 2 3 4
> a[a>4 &a<8]
[1] 5
> a[a[3]]
[1] 3
> which.max(a)
[1] 9
> a[which.max(a)]
[1] 15555
> which(a>1&a<5)
[1] 2 3 4
> a[which(a>1 &a<5)]
[1] 2 3 4
> a[which(a==9)]
[1] 9
> sort(a)
[1]     1     2     3     4     5     8     9    10 15555
> a
[1]     1     2     3     4     5     8     9    10 15555
> rev(a)
[1] 15555    10     9     8     5     4     3     2     1</span></span>

3、生成矩陣和矩陣操作相關函式:

R提供了陣列轉矩陣的函式(matrix()),矩陣是後續很多工作的開始:

1)、矩陣進行加減(+-)、相乘(%*%):

Ps:陣列生成矩陣時,預設是按照列方向進行,可以加引數byrow=T,使其按行方向生成矩陣 

a<-c(1:12)
> mat_a<-matrix(a,nrow=3,ncol=4)
> mat_a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> mat_aa<-matrix(a,nrow=4,ncol=3)
> mat_aa
     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12
> mat_b<-matrix(a,nrow=3,ncol=4)
> mat_b
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> mat_a+mat_b
     [,1] [,2] [,3] [,4]
[1,]    2    8   14   20
[2,]    4   10   16   22
[3,]    6   12   18   24
> mat_a%*%mat_aa
     [,1] [,2] [,3]
[1,]   70  158  246
[2,]   80  184  288
[3,]   90  210  330</span>
2)、取對角線(diag())、轉置(t())
> mat_a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> diag(mat_a)
[1] 1 5 9
> diag(4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1
> t(mat_a)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
[4,]   10   11   12
3)、求逆(solve)、解線性方程組(solve):
> a=matrix(rnorm(16),4,4)
> a
           [,1]       [,2]       [,3]         [,4]
[1,] -1.8060313 -0.1623095  1.6059096 -0.034760390
[2,] -0.5820759  0.5630558 -1.1578085 -0.669633580
[3,] -1.1088896  1.6478175  0.6565885 -0.007604756
[4,] -1.0149620 -0.7733534  2.5489911  1.777084448
> solve(a)
           [,1]       [,2]       [,3]       [,4]
[1,] -0.1579445 -0.8872690 0.12951969 -0.3368722
[2,] -0.2696348 -0.1950072 0.61120374 -0.0761404
[3,]  0.4008824 -0.9993255 0.20832490 -0.3678288
[4,] -0.7825607  0.8417821 0.04114366  0.8647852
> b=c(1:4)
> b
[1] 1 2 3 4
> solve(a,b)
[1] -2.8914122  0.8694004 -2.4441089  4.4835754
求特徵值特徵向量(eigen()) 
> a<-diag(4)+1
> a
     [,1] [,2] [,3] [,4]
[1,]    2    1    1    1
[2,]    1    2    1    1
[3,]    1    1    2    1
[4,]    1    1    1    2
> a.e=eigen(a,symmetric=T)
> a.e
$values
[1] 5 1 1 1

$vectors
     [,1]          [,2]       [,3]       [,4]
[1,] -0.5  0.000000e+00  0.0000000  0.8660254
[2,] -0.5 -6.408849e-17  0.8164966 -0.2886751
[3,] -0.5 -7.071068e-01 -0.4082483 -0.2886751
[4,] -0.5  7.071068e-01 -0.4082483 -0.2886751

R語言的基本資料結構—資料框

資料框也是矩陣形式,但不同於一般的矩陣,數控框中的列可以是不同的資料型別,每一列即為一個屬性值,每一行即為條記錄,或為一個物件的所有屬性的觀測值。

> x1=c(1:4)
> x2=c(rnorm(4))
> x3=c('52','72','03','789')
> x4=c(runif(4,min=10000,max=10005))
> y=data.frame(x1,x2,x3,x4)
> y
  x1         x2  x3       x4
1  1 -1.1386077  52 10002.51
2  2  1.3678272  72 10004.92
3  3  1.3295648  03 10001.62
4  4  0.3364728 789 10002.41

邏輯迴圈控制:

R語言支援for迴圈和while迴圈,兩種迴圈結構上和通用程式語言類似,但有少數差異。

> a
 [1]  1  2  3  4  5  6  7  8  9 10
> for(i in 1:10){a[i]=i*2+5}
> a
 [1]  7  9 11 13 15 17 19 21 23 25
> a=c(1:10)
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> i=1
> while (a[i]<5){a[i]=a[which.max(a)];i=i+1}
> a
 [1] 10 10 10 10  5  6  7  8  9 10
-------排序(降序) e=d[order(d$盈利,decreasing = TRUE),]