四方显神

导航

数据分析-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;amp;lt;span class="MathJax_Preview"&amp;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;amp;lt;span id="MathJax-Element-2-Frame" class="MathJax_SVG"&amp;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;amp;lt;span style="color: #ff6600;"&amp;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;amp;lt;span class="MathJax_Preview"&amp;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;amp;lt;span id="MathJax-Element-3-Frame" class="MathJax_SVG"&amp;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;amp;lt;span style="color: #ff6600;"&amp;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

但是用这两个函数,还需要记列名,$符就不用记列名了捏。

数据框也可以使用双中括号[[]]访问,与列表相同,返回是向量。

关于双中括号和单中括号,有一个经典的解释:

 

posted on 2023-11-18 17:25  szdbjooo  阅读(176)  评论(0)    收藏  举报