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']]