变量
基本说明
R语言计算的过程中,通常需要使用变量来存放中间结果。变量相当于给定一个空间,只能保存一种数据结构,只保存最后一次被赋值的数据。无需事先声明。
命名规则
变量名应该尽可能简单、意义明确,命名遵循一定规律,以便与他人交流理解。
- 只能使用字母(区分大小写)、数字、下划线“_”和英文句点“.”给变量命名;
- 不能以数字、下划线作为开头;
- 若以句点开头,第二位不能是数字;
| 变量名 | 有效性 | 原因 |
|---|---|---|
| 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