1. 程式人生 > >R語言--資料框

R語言--資料框

資料框

資料框是一種矩陣形式的資料,資料框各列中的資料可以是不同型別的資料。資料框每一列認為是一個變數,每一行是一個觀測;看以看做是矩陣的推廣。

資料框的生成函式:data.frame()

列入資料框列表的限制:

1:他的分量必須是向量 ---- 數值,字元,邏輯

-----因子

-----數值矩陣

-----列表

------其他資料框(實現了資料框的巢狀)

2:矩陣、列表和資料框提供許多變數

3:數值向量、邏輯值因子格式不變

------字元向量強制轉換為因子

------長度一致的變數形式的向量

------函式一致的矩陣結構

列表雖然可以存放不同型別的資料。但是他各個分量並不能實現對齊,(這個在上一篇已經說過),而資料框彌補了這個缺陷

> x

[1] 1 1 1 2 3 3 3

> y

[1] "女" "男" "男" "女" "女" "女" "男"

> z

[1] 80 86 86 75 64 54 67

> (student<-data.frame(x,y,z))

  x  y  z

1 1 女 80

2 1 男 86

3 1 男 86

4 2 女 75

5 3 女 64

6 3 女 54

7 3 男 67

 

可以將x,y,z的標題進行轉化:

可以對行名進行修改:row.names()

> (student<-data.frame(class=x,sex=y,score=z))

  class sex score

1     1  女    80

2     1  男    86

3     1  男    86

4     2  女    75

5     3  女    64

6     3  女    54

7     3  男    67

> row.names(student)<-c("曹操","王斌","劉備","劉鬆","王田","張飛","趙子龍")

> student

       class sex score

曹操       1  女    80

王斌       1  男    86

劉備       1  男    86

劉鬆       2  女    75

王田       3  女    64

張飛       3  女    54

趙子龍     3  男    67


 

資料框的引用,資料框使用陣列的形式去訪問;-------看成是特殊的陣列

返回y變數所有樣本的觀察數:

Student[,”student”] 

> student[,"score"]  #返回成績表

[1] 80 86 86 75 64 54 67

> student[,3] #返回第三列(成績)的資訊 (和上面的效果一樣)

[1] 80 86 86 75 64 54 67

> student[1:5,1:3]

     class sex score

曹操     1  女    80

王斌     1  男    86

劉備     1  男    86

劉鬆     2  女    75

王田     3  女    64

> student[,3]

[1] 80 86 86 75 64 54 67

> #返回1-5行,1-3列的資訊

> student[1:5,1:3]

     class sex score

曹操     1  女    80

王斌     1  男    86

劉備     1  男    86

劉鬆     2  女    75

王田     3  女    64

> student[,]   #和直接輸入student效果一樣

       class sex score

曹操       1  女    80

王斌       1  男    86

劉備       1  男    86

劉鬆       2  女    75

王田       3  女    64

張飛       3  女    54

趙子龍     3  男    67

用列表的形式訪問資料框(只要在列表的後面加上”$”在加上變數名即可):列表就是物件的集合;而且這些物件可以是不同型別的;資料框是特殊的列表,資料框的列可以看成是向量(要求是同一個型別的物件)

訪問資料框的形式:

> student$score

[1] 80 86 86 75 64 54 67

> student$sc

[1] 80 86 86 75 64 54 67

> student[["score"]]

[1] 80 86 86 75 64 54 67

> student[[3]]

[1] 80 86 86 75 64 54 67

 

把成績大於80的顯示出來:

 

> student[student$score>80,]

     class sex score

王斌     1  男    86

劉備     1  男    86

 

> student[student$score>80]

       sex score

曹操    女    80

王斌    男    86

劉備    男    86

劉鬆    女    75

王田    女    64

張飛    女    54

趙子龍  男    67

 

可以看到這裡並沒有報錯,但是執行結果也是不對的,它少了一個逗號,

#查詢出性別為男的

> student

       class sex score

曹操       1  女    80

王斌       1  男    86

劉備       1  男    86

劉鬆       2  女    75

王田       3  女    64

張飛       3  女    54

趙子龍     3  男    67

> student[which(student$sex=="男"),]

       class sex score

王斌       1  男    86

劉備       1  男    86

趙子龍     3  男    67

 

#把所有的性別統一為男

> student[student$sex<-"男"]

Error in `[.data.frame`(student, student$sex <- "男") :

  undefined columns selected

>student

       class sex score

曹操       1  男    80

王斌       1  男    86

劉備       1  男    86

劉鬆       2  男    75

王田       3  男    64

張飛       3  男    54

趙子龍     3  男    67

資料框繫結:

資料框的主要用途:儲存統計建模的資料,R語言軟體的統計建模功能需要用資料框作為輸入資料;訪問資料框的變數:資料框名$變數名;用可以把資料框中的變數連線到記憶體中,把資料框連線繫結到當前的名字空間,從而可以直接使用資料框中的變數名去訪問;而不用資料框名$變數名這種複雜的方式了;

一個變數即是全域性變數又是內部變數以全域性變數為主;

> attach(student)

The following object is masked _by_ .GlobalEnv:

 

    score

點選清空即可:

 

 

 

#在沒有繫結前是不能直接以變數名訪問資料框中的變數的

> score

Error: object 'score' not found

> y<-c("女","男","男","女","女","女","男")

> x<-c(1,1,1,2,3,3,3)

> z<-c(80,86,86,75,64,54,67)

> (student<-data.frame(x,y,z))

  x  y  z

1 1 女 80

2 1 男 86

3 1 男 86

4 2 女 75

5 3 女 64

6 3 女 54

7 3 男 67

> row.names(student)<-c("曹操","王斌","劉備","劉鬆","王田","張飛","趙子龍")

> student

       x  y  z

曹操   1 女 80

王斌   1 男 86

劉備   1 男 86

劉鬆   2 女 75

王田   3 女 64

張飛   3 女 54

趙子龍 3 男 67

> (student<-data.frame(class=x,sex=y,score=z))

  class sex score

1     1  女    80

2     1  男    86

3     1  男    86

4     2  女    75

5     3  女    64

6     3  女    54

7     3  男    67

> class

function (x)  .Primitive("class")

> score

Error: object 'score' not found

> (student<-data.frame(class=x,sex=y,score=z))

  class sex score

1     1  女    80

2     1  男    86

3     1  男    86

4     2  女    75

5     3  女    64

6     3  女    54

7     3  男    67

> class

function (x)  .Primitive("class")

> scpre

Error: object 'scpre' not found

> attach(student)  #進行繫結

#繫結後可以直接訪問變數名

> score

[1] 80 86 86 75 64 54 67

> class

[1] 1 1 1 2 3 3 3

繫結相當於把student的資料框放到記憶體中了

結繫結detach() / detach(student)

R語言的空間管理,執行時保持一個變數收索的路徑表,在讀取某個變數時,到這個收索路徑表當中,由前向後進行查詢,找到最前面一個,在賦值時,總是在位置1賦值(也可以有特別的指定);讀取變數的預設位置就是在變數收索路徑表的位置上來進行收索;

資料框的拆分和合並

有時希望分組進行統計分析或者只是分析其中的一部分資料,就可以通過拆分資料集來進行分析,有時希望把不同組的資料合併起來來進行分析;資料框的拆分與合併就是一個互逆的過程;

#載入資料集PlantGrowth

> data("PlantGrowth")

> PlantGrowth

   weight group     #weight權重,group分組

1    4.17  ctrl

2    5.58  ctrl

3    5.18  ctrl

4    6.11  ctrl

5    4.50  ctrl

6    4.61  ctrl

7    5.17  ctrl

8    4.53  ctrl

9    5.33  ctrl

10   5.14  ctrl

11   4.81  trt1

12   4.17  trt1

13   4.41  trt1

14   3.59  trt1

15   5.87  trt1

16   3.83  trt1

17   6.03  trt1

18   4.89  trt1

19   4.32  trt1

20   4.69  trt1

21   6.31  trt2

22   5.12  trt2

23   5.54  trt2

24   5.50  trt2

25   5.37  trt2

26   5.29  trt2

27   4.92  trt2

28   6.15  trt2

29   5.80  trt2

30   5.26  trt2

> unPG=unstack(PlantGrowth)

> PlantGrowth   weight group

1    4.17  ctrl

2    5.58  ctrl

3    5.18  ctrl

4    6.11  ctrl

5    4.50  ctrl

6    4.61  ctrl

7    5.17  ctrl

8    4.53  ctrl

9    5.33  ctrl

10   5.14  ctrl

11   4.81  trt1

12   4.17  trt1

13   4.41  trt1

14   3.59  trt1

15   5.87  trt1

16   3.83  trt1

17   6.03  trt1

18   4.89  trt1

19   4.32  trt1

20   4.69  trt1

21   6.31  trt2

22   5.12  trt2

23   5.54  trt2

24   5.50  trt2

25   5.37  trt2

26   5.29  trt2

27   4.92  trt2

28   6.15  trt2

29   5.80  trt2

30   5.26  trt2

> unPG

   ctrl trt1 trt2

1  4.17 4.81 6.31

2  5.58 4.17 5.12

3  5.18 4.41 5.54

4  6.11 3.59 5.50

5  4.50 5.87 5.37

6  4.61 3.83 5.29

7  5.17 6.03 4.92

8  4.53 4.89 6.15

9  5.33 4.32 5.80

10 5.14 4.69 5.26

 

 

拆分到以前的樣子: 

> SPG=stack(unPG)

> SPG

   values  ind

1    4.17 ctrl

2    5.58 ctrl

3    5.18 ctrl

4    6.11 ctrl

5    4.50 ctrl

6    4.61 ctrl

7    5.17 ctrl

8    4.53 ctrl

9    5.33 ctrl

10   5.14 ctrl

11   4.81 trt1

12   4.17 trt1

13   4.41 trt1

14   3.59 trt1

15   5.87 trt1

16   3.83 trt1

17   6.03 trt1

18   4.89 trt1

19   4.32 trt1

20   4.69 trt1

21   6.31 trt2

22   5.12 trt2

23   5.54 trt2

24   5.50 trt2

25   5.37 trt2

26   5.29 trt2

27   4.92 trt2

28   6.15 trt2

29   5.80 trt2

30   5.26 trt2

因子的應用:

summary():給出整個資料集的狀況

str():檢視結構

> patientID<-c(1,2,3,4)

> age<-c(25,35,35,46)

> diabetes<-c("Type1","Type2","Type1","Type1")

> status<-c("Poor","Imporved","Excellen","Poor")

> patientData<-data.frame(patientID,age,diabetes,status)

> patientData

  patientID age diabetes   status

1         1  25    Type1     Poor

2         2  35    Type2 Imporved

3         3  35    Type1 Excellen

4         4  46    Type1     Poor

> #因子

> #status用到排序型的因子

> status<-factor(status,ordered = TRUE)

> #diabetes是一個普通的因子

> diabetes <- factor(diabetes)

> patientData

  patientID age diabetes   status

1         1  25    Type1     Poor

2         2  35    Type2 Imporved

3         3  35    Type1 Excellen

4         4  46    Type1     Poor

> summary(patientData)

   patientID         age         diabetes      status

 Min.   :1.00   Min.   :25.00   Type1:3   Excellen:1  

 1st Qu.:1.75   1st Qu.:32.50   Type2:1   Imporved:1  

 Median :2.50   Median :35.00             Poor    :2  

 Mean   :2.50   Mean   :35.25                         

 3rd Qu.:3.25   3rd Qu.:37.75                         

 Max.   :4.00   Max.   :46.00                         

> str(patientData)

'data.frame': 4 obs. of  4 variables:

 $ patientID: num  1 2 3 4

 $ age      : num  25 35 35 46

 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1

 $ status   : Factor w/ 3 levels "Excellen","Imporved",..: 3 2  #排序了