R in Action(1) 基本数据结构

一数据类型 

    R的数据类型包括数值型、字符型、逻辑型(布尔)、复数型和原生型,同时R有好多存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表,如下图所示下图(图的版权神马的归原作者跟原出版社所有,赶紧避嫌,呵呵)

1、向量操作

1 a <- c(1, 2, 5, 3, 6, -2, 4)
2 b <- c("one", "two", "three")
3 c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)

    上面把3列向量赋与a,b,c,注意这里向量内的元素必须是同一种数据类型(数值型、字符型和逻辑型)
    访问向量如a[c(2,4)],将会得到a[2]跟a[4]的值,注意R与C、Python不一样,下标访问从1开始。

a[2:4] 得到a[2],a[3],a[4]三个值,这里2:4等价于c(2,3,4)

 

2、矩阵操作

 1 > y <- matrix(1:10, nrow = 5, ncol = 2)
 2 > y
 3      [,1] [,2]
 4 [1,]    1    6
 5 [2,]    2    7
 6 [3,]    3    8
 7 [4,]    4    9
 8 [5,]    5   10
 9 > y <- matrix(1:10, nrow = 5, ncol = 2,byrow=TRUE)
10 > y
11      [,1] [,2]
12 [1,]    1    2
13 [2,]    3    4
14 [3,]    5    6
15 [4,]    7    8
16 [5,]    9   10

上面代码是创建矩阵的代码,第一段跟第二段的区别是后者采用了按行的方式填充,R中默认是按列填充。

 1 cells <- c('东邪', '西毒', '南帝', '北丐')
 2 rnames <- c("R1", "R2")
 3 cnames <- c("C1", "C2")
 4 mymatrix <- matrix(cells, nrow = 2, ncol = 2, byrow = TRUE, 
 5                    dimnames = list(rnames, cnames))
 6 
 7 > mymatrix
 8    C1     C2    
 9 R1 "东邪" "西毒"
10 R2 "南帝" "北丐"

类似跟向量一样矩阵内的元素也要保持一致,上面代码可以给行列取别名。
访问矩阵:

 1 > mymatrix[2]
 2 [1] "南帝"
 3 > mymatrix[2,2]
 4 [1] "北丐"
 5 > mymatrix[2,1:2]
 6     C1     C2 
 7 "南帝" "北丐" 
 8 > mymatrix[2,]
 9     C1     C2 
10 "南帝" "北丐" 
11 > mymatrix[,1]
12     R1     R2 
13 "东邪" "南帝" 
14 > mymatrix[,1:2]
15    C1     C2    
16 R1 "东邪" "西毒"
17 R2 "南帝" "北丐"

3、数据框操作
    这是R里应用较为广泛的数据结构,它较矩阵具有更一般的形式,data_frame <- data.frame(col1,col2,....) 其中col1,col2可以为不同的数据类型。

创建一个数据框

 1 > patientID <- c(1, 2, 3, 4)
 2 > age <- c(25, 34, 28, 52)
 3 > diabetes <- c("Type1", "Type2", "Type1", "Type1")
 4 > status <- c("Poor", "Improved", "Excellent", "Poor")
 5 > patientdata <- data.frame(patientID, age, diabetes, 
 6 +                           status)
 7 > patientdata
 8   patientID age diabetes    status
 9 1         1  25    Type1      Poor
10 2         2  34    Type2  Improved
11 3         3  28    Type1 Excellent
12 4         4  52    Type1      Poor

patientdata是一个包含4列的数据框,访问每一列可以用patientdata$age实现
对每一列做处理的时候 都要加上数据框名字+$这个确实很繁琐,可以利用{attach(),detach()}和with()函数简化

例如

1 plot(patientdata$patientID,patientdata$age)
2 
3 attach(patientdata)
4 plot(patientID,age)
5 detach(patientdata)

第一行代码可以用后三行代码替换,但是这里要注意一个问题,就是数据框里面列名不能跟外部内存对象同名。
为解决这个问题,下面直接把操作都放到with()里面。

1 with(patientdata,{plot(patientID,age)})


4、因子操作

     这个相当于把列里面字符型元素,进行数字编码,在分类算法里面也通常对字符型特征进行数字编码(通常添加特征进行01编码)

 1 > patientID <- c(1, 2, 3, 4)
 2 > age <- c(25, 34, 28, 52)
 3 > diabetes <- c("Type1", "Type2", "Type1", "Type1")
 4 > status <- c("Poor", "Improved", "Excellent", "Poor")
 5 > diabetes <- factor(diabetes)
 6 > status <- factor(status, order = TRUE)
 7 > patientdata <- data.frame(patientID, age, diabetes, 
 8 +                           status)
 9 > str(patientdata)
10 'data.frame':    4 obs. of  4 variables:
11  $ patientID: num  1 2 3 4
12  $ age      : num  25 34 28 52
13  $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
14  $ status   : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
15 > summary(patientdata)
16    patientID         age         diabetes       status 
17  Min.   :1.00   Min.   :25.00   Type1:3   Excellent:1  
18  1st Qu.:1.75   1st Qu.:27.25   Type2:1   Improved :1  
19  Median :2.50   Median :31.00             Poor     :2  
20  Mean   :2.50   Mean   :34.75                          
21  3rd Qu.:3.25   3rd Qu.:38.50                          
22  Max.   :4.00   Max.   :52.00   

通常内置的是按字母顺序创建,例如Excellent、Improved、Poor编码成0、1、2
5、列表操作

1 g <- "My First List"
2 h <- c(25, 26, 18, 39)
3 j <- matrix(1:10, nrow = 5)
4 k <- c("one", "two", "three")
5 mylist <- list(title = g, ages = h, j, k)

列表访问的时候mylist[[2]]和mylist[['age']]

posted @ 2013-09-25 21:26  kobeshow  阅读(643)  评论(0编辑  收藏  举报