R的数据存储对象包括:标量、向量、矩阵、数组、数据框和列表。
*标量是只含一个元素的向
# 标量的赋值
a = 2
b = "c"
c = TRUE
1)向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组,单个向量中的数据必须拥有相同的类型或模式。
a)向量的创建输入
# 用函数c来创建向量,内容为数、字符串或布尔类型(可简写)
x <- c(1,2,3,4,5)
y <- c('one','two','three')
z <- c(TRUE,FALSE,T,F)
# 生成等差数列
c(1:100)
seq(from=1,to=100)
seq(from=1,to=100,by=2) # 设置等差
seq(from=1,to=100,length.out = 10) # 设置输出数量
# 生成重复序列
>rep(2,5)
[1] 2 2 2 2 2
rep(x,5) # 刚刚的向量x重复5次
rep(x,each=5) # each设置耽搁元素重复次数
mode(x) # mode()查看向量的类型,向量必须为同一类型,因为同一类型才能进行计算
# 向量化编程(R的精髓)
# 循环,向量控制向量输出
> x <- c(1,2,3,4,5)
> y <- c(6,7,8,9,10)
> 2*x+y
[1] 8 11 14 17 20
> x[x>3]
[1] 4 5
> rep(x,c(2,4,6,1,3)) # 按照c向量中给定次数分别循环不同元素
[1] 1 1 2 2 2 2 3 3 3 3 3 3 4 5 5 5
# 循环,用逻辑值控制输入输出
> y <- c(1:10)
> y
[1] 1 2 3 4 5 6 7 8 9 10
> y[c(T,T,F,T)] # 不一定等于元素数,可以循环使用
[1] 1 2 4 5 6 8 9 10
> y[c(T,T,F,T,T,T,F,T,T,T,F,T)] # 多了则用NA补
[1] 1 2 4 5 6 8 9 10 NA
# which返回索引值
> t <- c(1,3,6,4,8,9)
> t
[1] 1 3 6 4 8 9
> which.max(t)
[1] 6
> which(t==6)
[1] 3
> which(t>5)
[1] 3 5 6
b)向量的增删改查
# 向量的查找
# 向量索引(从1开始
> x <- c(1:100)
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[23] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
[45] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
[67] 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
[89] 89 90 91 92 93 94 95 96 97 98 99 100
> length(x) # 向量长度
[1] 100
> x[2] # 向量索引,元素索引从1开始
[1] 2
> x[-19] # 输出除19以外的数
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23
[23] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
[45] 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
[67] 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
[89] 90 91 92 93 94 95 96 97 98 99 100
> x[c(4:18)] # 切片
[1] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
> x[c(2,34,56,78,90)] # 定点
[1] 2 34 56 78 90
> # 字符串向量该如何访问
> z <- c('one','two','three','four','five')
> z
[1] "one" "two" "three" "four" "five"
> "one" %in% z # 判断字符串是否在向量中
[1] TRUE
> z %in% c('one','three')
[1] TRUE FALSE TRUE FALSE FALSE
# 用逻辑符号控制输入输出
> z[z %in% c('one','three')] #最终元素是否在c('one','three')中
[1] "one" "three"
# 利用表头名称访问,以euro为例
> euro
ATS BEF DEM ESP FIM FRF IEP
13.760300 40.339900 1.955830 166.386000 5.945730 6.559570 0.787564
ITL LUF NLG PTE
1936.270000 40.339900 2.203710 200.482000
> names(euro)
[1] "ATS" "BEF" "DEM" "ESP" "FIM" "FRF" "IEP" "ITL" "LUF" "NLG" "PTE"
> euro['DEM']
DEM
1.95583
# 向量的增加
# 添加向量
> x[101] <- 101
> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
[23] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
[45] 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
[67] 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
[89] 89 90 91 92 93 94 95 96 97 98 99 100 101
# 批量增加赋值
> v <- 1:3
> v[c(4,5,6)] <- c(4,5,6) # 批量增加
> v[20] <- 4 # 超过原有索引用NA补齐
> v
[1] 1 2 3 4 5 6 NA NA NA NA NA NA NA NA NA NA NA NA NA 4
# 在第五个元素后面插入值
> append(x=v,values = 99,after = 5)
[1] 1 2 3 4 5 99 6 NA NA NA NA NA NA NA NA NA NA NA NA NA 4
> # 删除使用负索引重新赋值
> y[-c(1:3)]
four five six seven eight nine ten
4 5 6 7 8 9 10
# 替换(使用索引或者表头)
> y['four'] <- 100
> y[2] <-15
> y
one two three four five six seven eight nine ten
1 15 3 100 5 6 7 8 9 10
> v[3] <- 'll' # 数值向量如果赋值字符串,则会直接变为字符串向量
> v
[1] "1" "2" "ll" "4" "5" "6" NA NA NA NA NA NA NA NA NA NA NA NA
[19] NA "4"
2)矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)
a)矩阵的创建输入
# 创建矩阵,元素必须够分
x <- 1:20
m <- matrix(x,nrow=4,ncol=5)
m2 <- matrix(1:20,4,5)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> m2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
m3 <- matrix(1:20,4,byrow=T)# R会自动进行分配,可以选择按行或列分配
m3 <- matrix(1:20,4,byrow=F)
# 给矩阵行列标题
rnames <- c('R1','R2','R3','R4')
cnames <- c('C1','C2','C3','C4','C5')
dimnames(m) <- list(rnames,cnames)
> m
C1 C2 C3 C4 C5
R1 1 5 9 13 17
R2 2 6 10 14 18
R3 3 7 11 15 19
R4 4 8 12 16 20
# 查看矩阵维数
dim(m)
# 给向量加维数
dim(x) <- c(5,4)
x <- 1:30
dim(x) <- c(5,3,2)
# 使用array创建
dim1 <- c('A1','A2')
dim2 <- c('B1','B2','B3')
dim3 <- c('C1','C2','C3','C4')
z <- array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))
z
b)矩阵的增删改查及计算
# 矩阵索引增删改查
> m <- matrix(1:20,4,5,byrow = T)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20
> m[1,2]
[1] 2
> m[1,c(2,3,4)] # 第一行的2,3,4列
[1] 2 3 4
> m[c(2,3),c(3,4)] # 切片
[,1] [,2]
[1,] 8 9
[2,] 13 14
> m[,2] #第二列
[1] 2 7 12 17
> m[2,] #第二行
[1] 6 7 8 9 10
> m[2] #默认对应行第一列
[1] 6
> m[-1,2] # 去除第一行,再取第二列
[1] 7 12 17
# 用表头取矩阵前几行
head(state.x77)
state.x77[,'Income']
state.x77['Alaska',]
# 矩阵运算
m+1
m*2
colSums(m)
rowSums(m)
colMeans(m)
m*m # 对应位置直接相乘
n <- matrix(0:9,3,3)
t <- matrix(1:10,3,3)
n %*% t # 外积
m %*% t(m) # mxm的转置
diag(n) # 矩阵的对角
3)数据框
不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更 为一般。
# 数据框可通过函数data.frame()创建
> patientID <- c(1, 2, 3, 4)
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> patientdata <- data.frame(patientID, age, diabetes, status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
# 取出单独一列
> patientdata$patientID
[1] 1 2 3 4
> patientdata[1:2]
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
> patientdata[c("diabetes", "status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
# with也可以达成提取单独某列
with(mtcars,(mpg))
with(mtcars,(sum(mpg)))
4)列表
列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分, component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。
a)列表的创建输入
> a <- 1:20
> b <- matrix(1:20,4)
> c <- mtcars
> d <- "hello world!"
> mlist <- list(a,b,c,d) # 用list组成矩阵
> mlist <- list(Fi=a,S=b,T=c,Fr=d) # 给每个元素赋值
> mlist
$Fi
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$S
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
$T
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
$Fr
[1] "hello world!"
# 通过索引访问
mlist[1]
mlist[c(1,4)]
# 通过名字访问
state.center[c('x','y')]
# 通过$访问
mlist$T
# 一个[]输出列表的一个子集,仍是列表
> mlist[1]
$Fi
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> class(mlist[1])
[1] "list"
# 两个[[]]输出元素本身的数据类型
> mlist[[1]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> class(mlist[[1]])
[1] "integer"
> # 要赋值必须给元素本身的数据类型
> mlist[[2]] <- iris
# 删除列表某一元素,可以采用-4去除
mlist[-4]
# 或者NULL赋值给对应元素
mlist[[4]] <- NULL
5)因子
名义型变量和有序性变量统称为因子,统称为水平,如good,better,best。
未完待续