数据分析-R语言学习笔记(二)R数据结构
一、数据类型
R语言中基本数据类型有三种:数字numeric、逻辑logical、文本character。
R中复制比较常用的赋值是 "<-",也可以用"="。
注:R中内置了一个同名函数c(),一般不用字母"c"作为变量或对象名称。
二、数据结构
R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度、以及用于定位和访问其中个别元素的标记等方面均有所不同。

1.向量:
一种类型的数据组成的集合。也即单个向量中的数据必须拥有相同的类型或者模式(数值型、字符型、逻辑型),同一向量中无法混杂不同模式的数据。
注意:R语言中c()函数的作用是将括号里的元素结合为向量。
向量化编程,是指对象量的运算,实际上是对向量中每个元素进行运算:
x <- c(1:10) x g <- c(1,2) x+g #结果是:2 4 4 6 6 8 8 10 10 12 ,可见是循环进行操作
z <- c(1,2,3) x+z #Warning message:In x + z : 长的对象长度不是短的对象长度的整倍数
与向量有关的基本操作:
#快速创建连续数列 a <- c(1:10) #seq 函数创建数列 a <- seq(1,10,2) # seq(from,to,step) #重复函数rep rep(x,times=value1) #表示将x重读value1次 a <- rep(3,4) #访问向量中的元素 a<-c(1,2,5,3,6,-2,4) a[3] a[c(1,3,4)] a[2:6] #修改向量中的元素 #创建向量 x <- c(1,2,24) #修改向量中的元素 x[c(1,3)]<-c(23,43) #负号表示删除元素 x <- c(1:10) x[-(1:5)]
与向量有关的进阶操作:
paste函数,将字符型变量合并成一个字符串,形式为:
paste("variable1","variable2",...,sep='',collapse=NULL)
其中sep参数是指变量和变量之间的连接,默认为空字符,collapse参数是指合并过后的原元素之间的连接,默认为空。
a <- paste("a","b","c",1:3,sep='')
a
# 运行结果是:"abc1" "abc2" "abc3"
b <- paste("a","b","c",1:3,sep='+')
b
# 运行结果是:"a+b+c+1" "a+b+c+2" "a+b+c+3"
d <- paste("a","b","c",1:3,sep='+',collapse = '------')
d
# 运行结果是:"a+b+c+1------a+b+c+2------a+b+c+3"
若是给定collapse一个参数就会变成一个合并的字符串,默认的话就是一个一个合并后的元素,可以看b和d的区别。
a <- paste("a","b","c",1:3,sep='')
a
# 运行结果是:"abc1" "abc2" "abc3"
a <- paste("a","b","c",1,2,sep='') a # 运行结果是:"abc12"
以上两个a 比较,可以体会一下这个函数的作用。
向量相关的运算:
#取向量中最小最大值 min() max() #求的是取得最小(大)值的第几个分量 which.min() which.max() sum() #求和 median() #求中位数 prod() #求积 var() #方差 mean() #平均值 sort() #给x排序,默认递增 rev() #倒序 order() #给x排序,给出递增的序列号
向量中通常会遇到NA和NULL,两者区别:
NA代表的是“缺失”,NULL代表大是“不存在"。
NA缺失就像占位符,这里没有一个值,但是位置存在。NULL代表的就是数据不存在。
length(c(NA,NA)) # 运行结果:2 length(c(NA,NULL)) # 运行结果:1
判断向量中的元素是否为NA:is.na()函数,例如:
is.na(c(NULL,NA,3)) #TRUE FALSE
逻辑型向量主要用于向量的逻辑运算,例如:比较大小和筛选数据。
比较包括:小于、小于等于、大于、大于等于、等于、不等于、属于,对应的运算符分别为:< <= > >= == != %in%
其中,“%in%”是比较特殊的比较,x%in%y 的运算把向量y看成是集合,运算结果是一个逻辑型向量, 第&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span class="MathJax_Preview"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span id="MathJax-Element-2-Frame" class="MathJax_SVG"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span style="color: #ff6600;"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;个元素的值为x的第&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span class="MathJax_Preview"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span id="MathJax-Element-3-Frame" class="MathJax_SVG"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;span style="color: #ff6600;"&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;元素是否属于y的逻辑型值。(这里不是很懂)
反正包含运算符很实用,比使用哈希等数据结构要方便。
# 逻辑数据的作用: # 比较大小: c(1,2,3)>2 #运行结果:FALSE FALSE TRUE #如果想要拿出这个向量中比2大的: a = c(1,2,3) b = a>2 #这里b是FALSE FALSE TRUE,那为什么下面就可以用a[b]取到结果为true的元素了?不是很理解 a[b] #我们需要从一个线性表中筛选大于等于60且小于70的数据: vector = c(10,40,78,64,55,62,69,70) vector[vector>=60 & vector<70 ] #拓展:与或非的使用 vector[vector>=60 | vector<30] vector[!vector>=60]
2.矩阵:
很多个向量拼接在一起形成矩阵。R语言中矩阵是有维数的向量,这里矩阵元素可以是数值型,字符型或者逻辑型,但是每个元素必须拥有相同的模式,这个和向量一致。
矩阵常用命令:
heatmap(state.x77) #绘制热图
矩阵行数和列数的分配必须满足分配条件:
> x <- 1:20
> matrix(x,nrow = 4,ncol = 5)
[,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
> matrix(x,nrow = 4,ncol = 4)
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
Warning message:
In matrix(x, nrow = 4, ncol = 4) :
data length differs from size of matrix: [20 != 4 x 4]
> matrix(x,nrow = 3,ncol = 3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
Warning message:
In matrix(x, nrow = 3, ncol = 3) : 数据长度[20]不是矩阵行数[3]的整倍
> matrix(x,nrow = 5) #行和列只给一个,另一个会自动分配
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
byrow参数更改按行分布(矩阵默认是按列分布):
> m <- matrix(1:20,5,byrow = TRUE) #行和列只给一个,另一个会自动分配
> m
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
[4,] 13 14 15 16
给矩阵行和列命名:
m <- matrix(1:20,4)
# 还可以给行和列命名
rnames <- c("R1","R2","R3","r4")
cnames <- c("C1","c2","c3","c4","c5")
dimnames(m) <- list(rnames,cnames)
m
最终结果:
> 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()函数为向量添加维数使之变成矩阵:
x <- 1:20 x # 此时X为向量 dim(x) <- c(4,5) x # 已经变成矩阵
运行结果:
> x <- 1:20
> x # 此时X为向量
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
> dim(x) <- c(4,5)
> x # 已经变成矩阵
[,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
访问、删除、修改矩阵中的数据:
R中使用线性代数中的i、j记号体系,i表示行号,j表示列号,通过i、j可以访问到矩阵中任意的元素:
> 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)] #一次访问多个元素
[1] 2 3 4
> m[c(2:4),c(2:3)]
[,1] [,2]
[1,] 7 8
[2,] 12 13
[3,] 17 18
> m[,2] # 访问第二列,省略行号或列号就是访问所有行或列
[1] 2 7 12 17
> m[2] # 数组中的逗号非常重要,没有就是一个数字
[1] 6
> m[-1,2] #负数是去除的意思,去除了第一行,访问第二列
[1] 7 12 17
如果矩阵中具有名称等属性,可以通过名称访问:
> dimnames(m) = list(rnames,cnames)
> m
C1 c2 c3 c4 c5
R1 1 2 3 4 5
R2 6 7 8 9 10
R3 11 12 13 14 15
r4 16 17 18 19 20
> m["R1"] #但是这样访问不行捏
[1] NA
> m["R1",] #要加逗号,访问列就是逗号加前面
C1 c2 c3 c4 c5
1 2 3 4 5
> m["R1","c2"] [1] 2
> head(state.x77) #用这个自带的数据集试试
Population Income Illiteracy Life Exp Murder HS Grad Frost Area
Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708
Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432
Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417
Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945
California 21198 5114 1.1 71.71 10.3 62.6 20 156361
Colorado 2541 4884 0.7 72.06 6.8 63.9 166 103766
> state.x77[,"income"] # 这里作为列名是区分大小写的
Error in state.x77[, "income"] : 下标出界
> state.x77[,"Income"]
Alabama Alaska Arizona Arkansas California
3624 6315 4530 3378 5114
Colorado Connecticut Delaware Florida Georgia
4884 5348 4809 4815 4091
Hawaii Idaho Illinois Indiana Iowa
4963 4119 5107 4458 4628
Kansas Kentucky Louisiana Maine Maryland
4669 3712 3545 3694 5299
Massachusetts Michigan Minnesota Mississippi Missouri
4755 4751 4675 3098 4254
Montana Nebraska Nevada New Hampshire New Jersey
4347 4508 5149 4281 5237
New Mexico New York North Carolina North Dakota Ohio
3601 4903 3875 5087 4561
Oklahoma Oregon Pennsylvania Rhode Island South Carolina
3983 4660 4449 4558 3635
South Dakota Tennessee Texas Utah Vermont
4167 3821 4188 4022 3907
Virginia Washington West Virginia Wisconsin Wyoming
4701 4864 3617 4468 4566
矩阵的运算:
> m<-matrix(1:20,4,5,byrow = T)
> m+1
[,1] [,2] [,3] [,4] [,5]
[1,] 2 3 4 5 6
[2,] 7 8 9 10 11
[3,] 12 13 14 15 16
[4,] 17 18 19 20 21
> 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
[,1] [,2] [,3] [,4] [,5]
[1,] 2 3 4 5 6
[2,] 7 8 9 10 11
[3,] 12 13 14 15 16
[4,] 17 18 19 20 21
> m*2
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 12 14 16 18 20
[3,] 22 24 26 28 30
[4,] 32 34 36 38 40
> m+m
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 12 14 16 18 20
[3,] 22 24 26 28 30
[4,] 32 34 36 38 40
> n <- matrix(1:20,5,4)
> n
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> m+n
Error in m + n : 非整合陈列
> m[1,]
[1] 1 2 3 4 5
> t <- m[1,]
> t
[1] 1 2 3 4 5
> sum(t) #有一些内置函数可以用
[1] 15
> colSums(m)
[1] 34 38 42 46 50
> rowSums(m)
[1] 15 40 65 90
> colMeans(m)
[1] 8.5 9.5 10.5 11.5 12.5
> rowMeans(m)
[1] 3 8 13 18
3.数组:
很多个矩阵拼接在一起形成数组。
R中向量有点像其他语言的数组,R中的数组其实就是多维矩阵
dim()函数如果给向量三个值,那么就是三维数组。
如下例子:其实三维数组应该是一个有空间结构的数据集,只是我们在控制台还无法显示空间结构,可以想象为一个长宽高为2、2、5的长方体。
> x <- 1:20
> dim(x) <- c(2,2,5)
> x
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 11
[2,] 10 12
, , 4
[,1] [,2]
[1,] 13 15
[2,] 14 16
, , 5
[,1] [,2]
[1,] 17 19
[2,] 18 20
数组还可以使用array函数创建:
> ?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 #这里有点像四个,两行,三列,的矩阵
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
R自带的数据集Titanic记录了泰坦尼克号上乘客的生存和死亡信息,该数据集包含船舱等级(class)、性别 (sex)、年龄(age)、生存状态(survived)四个类别变量,经常做为数据分析的经典数据集。titanic数据集其实就是一个数组:
> Titanic
, , Age = Child, Survived = No
Sex
Class Male Female
1st 0 0
2nd 0 0
3rd 35 17
Crew 0 0
, , Age = Adult, Survived = No
Sex
Class Male Female
1st 118 4
2nd 154 13
3rd 387 89
Crew 670 3
, , Age = Child, Survived = Yes
Sex
Class Male Female
1st 5 1
2nd 11 13
3rd 13 14
Crew 0 0
, , Age = Adult, Survived = Yes
Sex
Class Male Female
1st 57 140
2nd 14 80
3rd 75 76
Crew 192 20
矩阵也有乘法,且分为内积和外积:
> n<-matrix(1:9,3,3)
> t<-matrix(2:10,3,3)
> n
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> t
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 3 6 9
[3,] 4 7 10
> n*t #对应位置的元素相乘。和矩阵加法一样,内积
[,1] [,2] [,3]
[1,] 2 20 56
[2,] 6 30 72
[3,] 12 42 90
> n %*% t #这个是矩阵外积,是线代学的那个
[,1] [,2] [,3]
[1,] 42 78 114
[2,] 51 96 141
[3,] 60 114 168
矩阵转置:
> t
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 3 6 9
[3,] 4 7 10
> t(t) #t()转置
[,1] [,2] [,3]
[1,] 2 3 4
[2,] 5 6 7
[3,] 8 9 10
4.列表:
列表顾名思义就是用来存储很多内容的集合。在其他编程语言中,列表一般是和数组等同的,但是在R语言中,列表却是R中最复杂的一种数据结构,也是非常重要的一种数据结构。
列表就是一些对象的有序集合。列表中可以存储若干向量、矩阵、数据框、甚至其他列表的组合。
向量与列表:
在模式上和向量类似,都是一维的数据集合;
向量只能存储一种数据类型,列表中的对象可以是R中的任何数据结构,甚至是列表本身。
> a <- c(1:20)
> b <- matrix(1:20,4)
> c <- mtcars
> d <- "thisis a test list"
> a;b;c;d #此时列表就生成了
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[,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
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
[1] "thisis a test list"
> mlist <- list(a,b,c,d)
> mlist
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[[2]]
[,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
[[3]]
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
[[4]]
[1] "thisis a test list"
还可以对列表命名:
> mlist <- list(first=1,second=b,third=c,forth=d)
> mlist
$first
[1] 1
$second
[,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
$third
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
$forth
[1] "thisis a test list"
> mlist[c(1,4)] #一次访问列表中多个元素要使用c()
$first
[1] 1
$forth
[1] "thisis a test list"
> mlist["second"] #使用名字访问列表
$second
[,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
> mlist$forth #使用$符访问列表会自动提示元素名字,不需要自己输入了,十分高效
[1] "thisis a test list"
列表中还可以使用双中括号访问列表[[]],每次只能访问一个数据。
一个中括号访问列表的时候其实返回的是一个子集,所以还是一个列表;两个中括号输出的就是元素本身的数据类型:
> mlist[4] $forth [1] "thisis a test list" > mlist[[4]] [1] "thisis a test list" > class(mlist[4]) [1] "list" > class(mlist[[4]]) [1] "character"
删除列表元素:
> mlist[4] <- NULL
> mlist[3] <- NULL
> mlist
$first
[1] 1
$second
[,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
> mlist[3]
$<NA>
NULL
也相当于使用null清空这个元素的值。
5.数据框:
数据框是一种表格式的数据结构。数据框旨在模拟数据集,与其他统计软件例如SAS或者SPSS中的数据集的概念一致。
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。不同行业对于数据集的行和列叫法不同。
R中很多分析都是直接操作数据框来的。
数据框实际上是一个列表,列表中的元素是向量,这些向量构成数据框的列,每一列必须具有相同的长度,所以数据框是矩形结构,而且数据框的列必须命名。
数据框和矩阵:
- 数据框形状上很像矩阵;
- 数据框是比较规则的列表;
- 矩阵必须为同一数据类型,每一行可以不同。
R中有很多内置的数据框,比如iris鸢尾花数据集;mtcars,32辆汽车在11个指标上的数据,rock,48块石头的数据。、
利用data.frame()函数将数据合成一个数据框:
> state <- data.frame(state.name,state.abb,state.area)
> state
state.name state.abb state.area
1 Alabama AL 51609
2 Alaska AK 589757
3 Arizona AZ 113909
4 Arkansas AR 53104
5 California CA 158693
6 Colorado CO 104247
7 Connecticut CT 5009
8 Delaware DE 2057
9 Florida FL 58560
10 Georgia GA 58876
11 Hawaii HI 6450
12 Idaho ID 83557
13 Illinois IL 56400
14 Indiana IN 36291
15 Iowa IA 56290
16 Kansas KS 82264
17 Kentucky KY 40395
18 Louisiana LA 48523
19 Maine ME 33215
20 Maryland MD 10577
21 Massachusetts MA 8257
22 Michigan MI 58216
23 Minnesota MN 84068
24 Mississippi MS 47716
25 Missouri MO 69686
26 Montana MT 147138
27 Nebraska NE 77227
28 Nevada NV 110540
29 New Hampshire NH 9304
30 New Jersey NJ 7836
31 New Mexico NM 121666
32 New York NY 49576
33 North Carolina NC 52586
34 North Dakota ND 70665
35 Ohio OH 41222
36 Oklahoma OK 69919
37 Oregon OR 96981
38 Pennsylvania PA 45333
39 Rhode Island RI 1214
40 South Carolina SC 31055
41 South Dakota SD 77047
42 Tennessee TN 42244
43 Texas TX 267339
44 Utah UT 84916
45 Vermont VT 9609
46 Virginia VA 40815
47 Washington WA 68192
48 West Virginia WV 24181
49 Wisconsin WI 56154
50 Wyoming WY 97914
我们如果想将数据存储到R中进行分析,只需要每个内容单独存储为一个向量,然后利用data.frame()合并即可。(就是说存数据的时候用向量比较好存,然后R分析数据的时候用数据框便于分析,是这样吗)
数据框的访问:
> state[1] #通过索引访问
state.name
1 Alabama
2 Alaska
3 Arizona
4 Arkansas
5 California
6 Colorado
7 Connecticut
8 Delaware
9 Florida
10 Georgia
11 Hawaii
12 Idaho
13 Illinois
14 Indiana
15 Iowa
16 Kansas
17 Kentucky
18 Louisiana
19 Maine
20 Maryland
21 Massachusetts
22 Michigan
23 Minnesota
24 Mississippi
25 Missouri
26 Montana
27 Nebraska
28 Nevada
29 New Hampshire
30 New Jersey
31 New Mexico
32 New York
33 North Carolina
34 North Dakota
35 Ohio
36 Oklahoma
37 Oregon
38 Pennsylvania
39 Rhode Island
40 South Carolina
41 South Dakota
42 Tennessee
43 Texas
44 Utah
45 Vermont
46 Virginia
47 Washington
48 West Virginia
49 Wisconsin
50 Wyoming
> state[c(1,2)] #索引访问多个列
state.name state.abb
1 Alabama AL
2 Alaska AK
3 Arizona AZ
4 Arkansas AR
5 California CA
6 Colorado CO
7 Connecticut CT
8 Delaware DE
9 Florida FL
10 Georgia GA
11 Hawaii HI
12 Idaho ID
13 Illinois IL
14 Indiana IN
15 Iowa IA
16 Kansas KS
17 Kentucky KY
18 Louisiana LA
19 Maine ME
20 Maryland MD
21 Massachusetts MA
22 Michigan MI
23 Minnesota MN
24 Mississippi MS
25 Missouri MO
26 Montana MT
27 Nebraska NE
28 Nevada NV
29 New Hampshire NH
30 New Jersey NJ
31 New Mexico NM
32 New York NY
33 North Carolina NC
34 North Dakota ND
35 Ohio OH
36 Oklahoma OK
37 Oregon OR
38 Pennsylvania PA
39 Rhode Island RI
40 South Carolina SC
41 South Dakota SD
42 Tennessee TN
43 Texas TX
44 Utah UT
45 Vermont VT
46 Virginia VA
47 Washington WA
48 West Virginia WV
49 Wisconsin WI
50 Wyoming WY
> state[state.abb]
Error in `[.data.frame`(state, state.abb) : 选择了未定义的列
> state["state.abb"] #这里不太规范,通过列名访问需要加上一个逗号在前面,我这里不加也没毛病啊为什么非要加嘞
state.abb
1 AL
2 AK
3 AZ
4 AR
5 CA
6 CO
7 CT
8 DE
9 FL
10 GA
11 HI
12 ID
13 IL
14 IN
15 IA
16 KS
17 KY
18 LA
19 ME
20 MD
21 MA
22 MI
23 MN
24 MS
25 MO
26 MT
27 NE
28 NV
29 NH
30 NJ
31 NM
32 NY
33 NC
34 ND
35 OH
36 OK
37 OR
38 PA
39 RI
40 SC
41 SD
42 TN
43 TX
44 UT
45 VT
46 VA
47 WA
48 WV
49 WI
50 WY
> state[,"state.abb"]
[1] "AL" "AK" "AZ" "AR" "CA" "CO" "CT" "DE" "FL" "GA" "HI" "ID" "IL" "IN" "IA" "KS"
[17] "KY" "LA" "ME" "MD" "MA" "MI" "MN" "MS" "MO" "MT" "NE" "NV" "NH" "NJ" "NM" "NY"
[33] "NC" "ND" "OH" "OK" "OR" "PA" "RI" "SC" "SD" "TN" "TX" "UT" "VT" "VA" "WA" "WV"
[49] "WI" "WY"
> state["Alabama",] #这样为什么访问不出来嘞?是不是行名应该叫1 不叫alabama啊
state.name state.abb state.area
NA <NA> <NA> NA
> state["1",]
state.name state.abb state.area
1 Alabama AL 51609
> state$state.name #使用$符访问,列表也有这样访问的方法
[1] "Alabama" "Alaska" "Arizona" "Arkansas"
[5] "California" "Colorado" "Connecticut" "Delaware"
[9] "Florida" "Georgia" "Hawaii" "Idaho"
[13] "Illinois" "Indiana" "Iowa" "Kansas"
[17] "Kentucky" "Louisiana" "Maine" "Maryland"
[21] "Massachusetts" "Michigan" "Minnesota" "Mississippi"
[25] "Missouri" "Montana" "Nebraska" "Nevada"
[29] "New Hampshire" "New Jersey" "New Mexico" "New York"
[33] "North Carolina" "North Dakota" "Ohio" "Oklahoma"
[37] "Oregon" "Pennsylvania" "Rhode Island" "South Carolina"
[41] "South Dakota" "Tennessee" "Texas" "Utah"
[45] "Vermont" "Virginia" "Washington" "West Virginia"
[49] "Wisconsin" "Wyoming"
还可以绘制散点图来访问数据,例如women是15个女性身高和体重的数据集:
> women height weight 1 58 115 2 59 117 3 60 120 4 61 123 5 62 126 6 63 129 7 64 132 8 65 135 9 66 139 10 67 142 11 68 146 12 69 150 13 70 154 14 71 159 15 72 164 > plot(women$height,women$weight)

在利用ml函数进行线性回归的时候,直接给出列名即可,也非常容易:(这里不是很懂)
> lm(weight ~height,data = women)
Call:
lm(formula = weight ~ height, data = women)
Coefficients:
(Intercept) height
-87.52 3.45
attach()函数和with函数:
attach()函数是加载数据框到R搜索目录中,加载完成后我们就可以在当前窗口直接敲数据框列的名字就可以了,而不需要再使用$符了。
使用完数据之后可以使用detach()函数取消加载。
> mtcars$hp
[1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52 65 97
[22] 150 150 245 175 66 91 113 264 175 335 109
> hp
错误: 找不到对象'hp'
> attach(mtcars)
The following object is masked from package:ggplot2:
mpg
> hp
[1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52 65 97
[22] 150 150 245 175 66 91 113 264 175 335 109
> detach(mtcars)
> hp
错误: 找不到对象'hp'
> with(mtcars,{hp})
[1] 110 110 93 110 175 105 245 62 95 123 123 180 180 180 205 215 230 66 52 65 97
[22] 150 150 245 175 66 91 113 264 175 335 109
> with(mtcars,{mpg})
[1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4 10.4 14.7
[18] 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7 15.0 21.4
但是用这两个函数,还需要记列名,$符就不用记列名了捏。
数据框也可以使用双中括号[[]]访问,与列表相同,返回是向量。
关于双中括号和单中括号,有一个经典的解释:

浙公网安备 33010602011771号