【R语言入门(二)】认识、创建和使用多种数据结构:标量、向量、矩阵、数组、数据框和列表等等

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重复5rep(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)] # 第一行的234[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。
未完待续

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值