R语言入门——数据类型和数据结构

变量

基本说明

R语言计算的过程中,通常需要使用变量来存放中间结果。变量相当于给定一个空间,只能保存一种数据结构,只保存最后一次被赋值的数据。无需事先声明。

命名规则

变量名应该尽可能简单、意义明确,命名遵循一定规律,以便与他人交流理解。

  1. 只能使用字母(区分大小写)、数字、下划线“_”和英文句点“.”给变量命名;
  2. 不能以数字、下划线作为开头;
  3. 若以句点开头,第二位不能是数字;
变量名有效性原因
var_name1.有效符合规则1~3
var_name%1.无效不符合规则1,即不能包括符号“%”
1var_name.无效不符合规则2,即不能以数字开头
_var_name.无效不符合规则2,即不能以下划线开头
.var_name.有效符合规则1~3
.1var_name.无效不符合规则3,即点开头后不可跟数字
# 模拟表格中的6种命名方式,结果可以看出仅有第1、5种符合命名规则
> var_name1.<-1
> var_name1.
[1] 1

> var_name%1.<-1
Error: unexpected input in "var_name%1.<-1"

> 1var_name.<-1
Error: unexpected symbol in "1var_name."

> _var_name.<-1
Error: unexpected symbol in "_var_name."

> .var_name.<-1
> .var_name.
[1] 1

> .1var_name.<-1
Error: unexpected symbol in ".1var_name."

赋值符号

标准语法为左箭头<-

反转赋值为右箭头->

等号=也可以赋值,但是是不标准语法,某些情况下会出现错误。我的理解是等号只能将右边的值赋值给左侧变量,无法进行相反的操作,当左侧为值右侧为变量时会出现问题。

> a<-1
> 2->b
> c=3
> a
[1] 1
> b
[1] 2
> c
[1] 3

# 等号赋值*错误*举例
> 4=d
Error in 4 = d: invalid (do_set) left-hand side to assignment
> rnorm(5) = x
Error in rnorm(5) = x : 
  target of assignment expands to non-language object

数据类型

R可以处理的数据类型包括数值型、整数型、字符型、逻辑型、复数型和原生型。

分类

数值型

R语言中数字的默认类型为数值型,在运算时需要注意其精度问题。当整数部分大于等于7位时,将舍弃小数部分,当整数部分小于7位时,与小数部分一起最多保留7位数字。

整数型

R语言中整数型需要在整数后加L来表示,如1L、-10L。

字符型

字符串类型,用单引号或双引号包围表示。

逻辑型

TRUE或FALSE。

复数型

R语言支持复数计算。

原型

直接使用二进制内容来进行保存和使用的类型。不常见。

几种特殊的数据

正无穷InF  负无穷-InF  不可能的值NaN  缺失值NA

NULL常用于函数的参数中,表示该参数未赋值

> k<-c(0/0,0/1,1/0,-1/0,NA)
> k
[1]  NaN    0  Inf -Inf   NA
> class(k)
[1] "numeric"  #  其实本质上还是数值型变量

判断方法

class()函数

typeof()函数

is.xxx()系列函数。 其中 is.numeric() 对 integer 和 double (双精度型)内容都返回真值。

is.integer(), is.double(), is.numeric(), is.logical(), is.character(), is.complex(), is.raw()

is.nan(), is.infinite(), is.finite()

# 数值型(numeric)
> a1<-1
> class(a1)
[1] "numeric"
> typeof(a1)
[1] "double"

# 整数型(integer)
> a2<-1L
> class(a2)
[1] "integer"
> typeof(a2)
[1] "integer"

# 数值型(numeric)
> b<-3.9
> class(b)
[1] "numeric"
> typeof(b)
[1] "double"

# 字符型(character)
> c<-'B'
> class(c)
[1] "character"

# 逻辑型(logical)
> d<-TRUE
> class(d)
[1] "logical"

# 复数型(complex)
> e<-3+2i
> class(e)
[1] "complex"

# 原型(raw)
> f<-charToRaw("Hello") 
> class(f)
[1] "raw"

转换

as.xxx()系列函数。

as.integer(), as.double(), as.numeric(), as.logical(), as.character(), as.complex(), as.raw()

数据结构

R中用于储存数据的结构包括标量、向量、矩阵、数组、数据框和列表。

分类

标量

仅含有一个元素的向量。常用于保存常量。

> a<-3.14
> b<-'B'
> c<-FALSE

向量

用于储存数值型、字符型或逻辑型数据的一维数组。单个向量中的数据必须为相同类型。

通过c()创建向量:

> v1<-c(1:6)
> v2<-c('DOG','CAT','SHEEP')
> v3<-c(TRUE,FALSE,TRUE,FALSE,TRUE)
> v4<-c(1:5)
> names(v4)<-c('A','B','C','D','E')  #  给向量的每个值命名
> vector4
A B C D E 
1 2 3 4 5 

如果单个向量中的数据类型不同,会发生什么情况呢?

# 同时有数值型和逻辑型时,逻辑型TURE对应1,FALSE对应0
> v4<-c(1,TRUE,FALSE)
> v4
[1] 1 1 0

# 同时有数值型和字符型时,都储存为字符型
> v5<-c(1,'DOG',3,'CAT')
> v5
[1] "1"   "DOG" "3"   "CAT"

# 同时有数值型、逻辑型和字符型时,都储存为字符型
> v6<-c(1,FALSE,'SHEEP')
> v6
[1] "1"     "FALSE" "SHEEP"

矩阵

二维数组。单个矩阵中的数据必须为相同类型。

通过matrix()创建矩阵:

# 创建一个3行4列的矩阵
> matrix1<-matrix(c(1:12),3,4)
> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

# 创建一个3行4列的矩阵,值按行填充(默认按列填充)
> matrix2<-matrix(c(1:12),3,4,byrow = T)
> matrix2
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

# 创建一个3行4列的矩阵,同时命名行名和列名
> matrix3<-matrix(c(1:12),3,4,,
+                 dimnames = list(c('A','B','C'),c('a','b','c','d')))
> matrix3
  a b c  d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12

# 创建一个3行4列的矩阵,之后命名行名和列名
> matrix4<-matrix(c(1:12),3,4)
> rownames(matrix4)<-c('A','B','C')
> colnames(matrix4)<-c('a','b','c','d')
> matrix4
  a b c  d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12

数组

与矩阵类似,维度可以大于2。单个数组中的数据必须为相同类型。

通过array()创建数组:

# 创建一个三维数组
> array1<-array(c(1:24),dim=c(2,4,3))
> array1
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

, , 2

     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16

, , 3

     [,1] [,2] [,3] [,4]
[1,]   17   19   21   23
[2,]   18   20   22   24

# 创建一个三维数组,并为各维度命名
> array2<-array(c(1:24),dim=c(2,4,3),
+               dimnames = list(c('A1','A2'),c('B1','B2','B3','B4'),c('C1','C2','C3')))
> array2
, , C1

   B1 B2 B3 B4
A1  1  3  5  7
A2  2  4  6  8

, , C2

   B1 B2 B3 B4
A1  9 11 13 15
A2 10 12 14 16

, , C3

   B1 B2 B3 B4
A1 17 19 21 23
A2 18 20 22 24

# 创建一个四维数组
> array3<-array(c(1:48),dim=c(3,4,2,2))
> array3
, , 1, 1

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2, 1

     [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

, , 1, 2

     [,1] [,2] [,3] [,4]
[1,]   25   28   31   34
[2,]   26   29   32   35
[3,]   27   30   33   36

, , 2, 2

     [,1] [,2] [,3] [,4]
[1,]   37   40   43   46
[2,]   38   41   44   47
[3,]   39   42   45   48

数据框

二维,可以包含不同数据类型。R中最常处理的数据结构。

通过data.frame()创建数据框:

# 创建一个数据框,包含三种数据类型
> name<-c('Amy','Ben','Cindy')
> age<-c(10,12,17)
> data<-c(T,F,T)
> df1<-data.frame(name,age,data)
> df1
   name age  data
1   Amy  10  TRUE
2   Ben  12 FALSE
3 Cindy  17  TRUE

列表

列表是R中最灵活、最为复杂的一种数据结构。是一些对象的有序集合,对象可以是向量、矩阵、数组、数据框,甚至其他列表。

通过list()创建列表:

# 创建一个包含向量、矩阵、数组和数据框的列表
> list1<-list(v1,matrix3,array2,df1)
> list1
[[1]]
[1] 1 2 3 4 5 6

[[2]]
  a b c  d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12

[[3]]
, , C1

   B1 B2 B3 B4
A1  1  3  5  7
A2  2  4  6  8

, , C2

   B1 B2 B3 B4
A1  9 11 13 15
A2 10 12 14 16

, , C3

   B1 B2 B3 B4
A1 17 19 21 23
A2 18 20 22 24


[[4]]
   name age  data
1   Amy  10  TRUE
2   Ben  12 FALSE
3 Cindy  17  TRUE

# 为列表中的各个对象命名
names(list1)<-c('A','B','C','D')

因子

变量和分为连续型、有序型和名义型。①连续型变量比如年龄,可以是10.5或14.3,同时表示了顺序和数量。②有序型变量比如成绩,可以是甲乙丙丁,只表示一种顺序关系,不代表数量关系。③名义型变量比如性别,是无序的,仅表示没有顺序之分的不同类别。

有序型变量和名义型变量在R中被称为因子。

函数factor()以整数向量的形式储存类别值,整数的取值范围是[1…k],其中k是变量中唯一值的个数,同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。

通过factor()创建因子:

# 未给定顺序时结果如下,默认按字母顺序排序
> factor1<-factor(c('甲','乙','甲','丁','丙','乙'))
> factor1
[1] 甲 乙 甲 丁 丙 乙
Levels: 丙 丁 甲 乙

# 给定顺序时结果如下
> factor2<-factor(c('甲','乙','甲','丁','丙','乙'),order=T,
+                 levels=c('甲','乙','丙','丁'))
> factor2
[1] 甲 乙 甲 丁 丙 乙
Levels: 甲 < 乙 < 丙 < 丁

数值型变量可以通过factor()转换成因子:

> sex<-c(1,2,1,1,2)
> sex<-factor(sex,levels=c(1,2),labels = c('Male','Female'))
> sex
[1] Male   Female Male   Male   Female
Levels: Male Female

调用

中括号[]和$是常见的调用数据结构中数值的方法。

其中向量、矩阵、数组只能用[]来进行调用,数据框和列表可以仅用[]进行调用,也可以结合[]和$调用。

向量

> vector1<-c(10:20)
> vector1[c(3,6,9)]  #  调用第3、6、9个元素
[1] 12 15 18
> vector1[c(3:6)]  #  调用第3到第6个元素
[1] 12 13 14 15
> vector1[c(T,F,T,F,T,F,T,F,T,F,T)]  #  调用逻辑值为TRUE的对应值
[1] 10 12 14 16 18 20
> vector1[c(T,F,F)]  #  即使逻辑值与元素个数不是一一对应也可以调用,逻辑似乎是多次重复向量
[1] 10 13 16 19
> vector1[-2]  #  方括号中也可以为负数,表示不调用第2个元素
[1] 10 12 13 14 15 16 17 18 19 20
> vector1[c(-1:-5)]  #  方括号中也可以为负数向量,表示不调用第1到第5个元素
[1] 15 16 17 18 19 20

> vector2<-c(1:5)
> names(vector2)<-c('A','B','C','D','E')
> vector2
A B C D E 
1 2 3 4 5 
> vector2['B']  #  调用名称为B的值
B 
2 

矩阵

> matrix1<-matrix(c(1:12),3,4)
> matrix1
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> matrix1[2, ]  #  调用第2行
[1]  2  5  8 11
> matrix1[ ,3]  #  调用第3列
[1] 7 8 9
> matrix1[2,4]  #  调用第2行第4列
[1] 11
> matrix1[c(1,3),4]  #  调用第1、3行第4列
[1] 10 12

> matrix2<-matrix(c(1:12),3,4,
+                 dimnames = list(c('r1','r2','r3'),c('c1','c2','c3','c4')))
> matrix2
   c1 c2 c3 c4
r1  1  4  7 10
r2  2  5  8 11
r3  3  6  9 12
> matrix2['r2',c(2:4)]  #  调用行名为r2,第2到4列的元素
c2 c3 c4 
 5  8 11 

数组

> array1<-array(c(1:24),dim=c(2,4,3))
> array1
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

, , 2

     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16

, , 3

     [,1] [,2] [,3] [,4]
[1,]   17   19   21   23
[2,]   18   20   22   24

> array1[2,,]  #  调用第1维序号为2的各元素
     [,1] [,2] [,3]
[1,]    2   10   18
[2,]    4   12   20
[3,]    6   14   22
[4,]    8   16   24
> array1[,2,]  #  调用第2维序号为2的各元素
     [,1] [,2] [,3]
[1,]    3   11   19
[2,]    4   12   20
> array1[,,2]  #  调用第3维序号为2的各元素
     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16
> array1[1,,2]  #  调用第1维序号为1,并且第3维序号为2的各元素
[1]  9 11 13 15

# 也可以给数组各维度命名,调用方式与矩阵类似

数据框

> name<-c('Amy','Ben','Cindy')
> age<-c(10,12,17)
> data<-c(T,F,T)
> df1<-data.frame(name,age,data)
> df1
   name age  data
1   Amy  10  TRUE
2   Ben  12 FALSE
3 Cindy  17  TRUE

> df1[1,]  #  调用第1行
  name age data
1  Amy  10 TRUE
> df1[,1]  #  调用第1列
[1] "Amy"   "Ben"   "Cindy"
> df1[2,3]  #  调用第2行第3列
[1] FALSE
> df1[2,'name']  #  调用第2行列名为name的列
[1] "Ben"
> df1$name  #  调用列名为name的列
[1] "Amy"   "Ben"   "Cindy"
> df1$age[2]  #  调用列名为age的列中第2行
[1] 12

生成列联表方法如下:

> name<-c('Amy','Ben','Cindy','Diana','Erick','Ford')
> sex<-factor(c(1,2,1,1,2,2),levels = c(1,2),labels = c('Male','Female'))
> grade<-factor(c(1,3,2,1,2,1),levels = c(1,2,3),labels = c('甲','乙','丙'))
> studentdata<-data.frame(name,sex,grade)
> studentdata
   name    sex grade
1   Amy   Male    甲
2   Ben Female    丙
3 Cindy   Male    乙
4 Diana   Male    甲
5 Erick Female    乙
6  Ford Female    甲

> table(studentdata$sex,studentdata$grade)  #  生成性别变量sex和成绩变量grade的列联表
        
         甲 乙 丙
  Male    2  1  0
  Female  1  1  1

列表

> list1<-list(vector1,matrix1,array1,df1)
> names(list1)<-c('A','B','C','D')
> list1
$A
 [1] 10 11 12 13 14 15 16 17 18 19 20

$B
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

$C
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    3    5    7
[2,]    2    4    6    8

, , 2

     [,1] [,2] [,3] [,4]
[1,]    9   11   13   15
[2,]   10   12   14   16

, , 3

     [,1] [,2] [,3] [,4]
[1,]   17   19   21   23
[2,]   18   20   22   24


$D
   name age  data
1   Amy  10  TRUE
2   Ben  12 FALSE
3 Cindy  17  TRUE

> list1[[1]]  #  引用list1中第1个对象
 [1] 10 11 12 13 14 15 16 17 18 19 20
> list1[[1]][5]  #  引用list1中第1个对象的第5个元素
[1] 14
> list1[['D']]['name']  #  引用list1中名称为D,列名为name的对象
   name
1   Amy
2   Ben
3 Cindy
> list1$B  #  引用list1中名称为B的对象
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> list1$B[3,2]  #  引用list1中名称为B的对象的第3行第2列个元素
[1] 6


版权声明:本文为fgh544568原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。