对象
R是一种基于对象的语言,所有变量、数据、函数及其结果等都以对象的形式存储,所有的对象都有两个内在属性:类型(mode),长度(length)
一个对象所有元素都是同一种基本类型,称这个对象为单纯对象
一个对象所有元素不是同一种基本类型,称这个对象为复合对象
1.对象的类型分为:
①数值型numeric ②字符型character ③复数型complex ④逻辑性logical
NA代表缺失数据 NAN代表非数字类型 ,Inf代表∞ , -Inf代表-∞
可用is.xxx()
函数判断是否为xxx类型的对象 可用as.xxx()
函数强转为xxx类型的对象
2.对象的长度:
获取对象的长度可用length()
函数,对象的长度可以修改,R允许超出对象长度的下标赋值,这时对象的长度自动伸长以包括此下标,其中间的元素设定为NA缺失值:
> y <- c(1:3)
> y
[1] 1 2 3
> y[6] <- 6
> y
[1] 1 2 3 NA NA 6
向量
向量vector()有两个参数:类型和长度,创建向量中元素的值取决于参数所指定的数据类型
1.向量的赋值
创建一个向量名为v的向量,可以使用c()
函数来建立向量:
> v <- c(2,4,6,8)
> v
[1] 2 4 6 8
> assign('v',c(1,3,5,7))
> v
[1] 1 3 5 7
2.向量的运算
在算术表达式中使用向量,将会对该向量中的每一个元素都进行同样的算术运算。当表达式中的不同向量长度不一致时,短的向量将会被循环使用(可能只是部分元素)。
基本运算符包括+ - * / ^等等
也可以使用函数对向量进行运算:
①常用数学函数: log , exp , sin ,cos ,tan, sqrt等
②max(), min(), sum() ,mean(), range(), length(), prod(), var(), sort()
.等
③使用which函数 ,可以根据要求返回对应分量的下角标: which.min(v)
返回v中最小值的下角标。
3.产生有规律的序列
①可以用':'
的方式实现 , 且在R中,':'
的优先级最高
②seq()函数可以生成数列,其基本形式为:
seq(from=1, to=1, by= , length= )
from,to代表起始和终止,by代表步长,length代表长度。
③rep()函数是重复函数,其基本形式为:
rep(x, times)
x代表向量数据,times代表重复的次数
④sequence()函数 可以创建一系列连续的整数序列,每个序列都以给定参数的数值结尾。
> sequence(3:5)
[1] 1 2 3 1 2 3 4 1 2 3 4 5
> sequence(c(3,5))
[1] 1 2 3 1 2 3 4 5
⑤gl()函数 可以生成不同的水平(类型)数据,能产生规则的因子序列。该函数的语法为:
gl(n,k,length=n*k,;abels=seq_len(n),ordered=FALSE)
n代表类别数,k代表每个类别重复的次数,length决定长度,labels代表水平因子名字,order代表是否排序。
> gl(2,4,labels=c('male','female'))
[1] male male male male female female female female
Levels: male female
> gl(2,4,length = 16)
[1] 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2
Levels: 1 2
逻辑向量
逻辑向量元素可以被赋值为TRUE,FALSE(可以被简写为T和F,但建议使用TRUE和FALSE)。
逻辑向量可以由条件式产生,例如:
> temp <- x>5
> temp
[1] FALSE FALSE FALSE FALSE FALSE TRUE
R中逻辑运算符包括> < >= <= == != 与运算& 或运算| 非运算!
all()
函数可以判断一个逻辑向量中的分量是否都为TRUE,any()
函数可以判断一个逻辑向量中是否存在一个TRUE值。
> all(temp)
[1] FALSE
> any(temp)
[1] TRUE
缺失数据NA
缺失数据NA是包括不可得到的数据(not available)与值丢失(missing value)的情况,任何含有NA数据的运算结果都是NA。
①is.na()
函数检验缺失数据,返回一个同等长度的向量,在缺失值处返回TRUE
> v <- c(1,3,5,7,NA)
> is.na(v)
[1] FALSE FALSE FALSE FALSE TRUE
②is.nan()
函数检验是否为非数值类型,在非数值处返回TRUE
③is.finite()
判断数值是否有限,有限时返回TRUE
④is.infinite()
判断数值是否无限,无限时返回TRUE
字符型向量
向量的元素取字符串时,需要用" "
引起来,通过c()函数可以将几个字符向量连接为一个字符向量:
> A <- c('chenyu','haoran')
> B <- c('shi','shuaige')
> c(A,B)
[1] "chenyu" "haoran" "shi" "shuaige"
paste()
函数可以将任意多的参数一个接一个连成字符串,默认以一个单位空格符连接:
> paste('this','is','a','example')
[1] "this is a example"
> paste('this','is','a','example',sep = '-')
[1] "this-is-a-example"
> paste('page',1:3,sep = '-')
[1] "page-1" "page-2" "page-3"
向量的下标系统
下标系统可以用来有效且灵活的选择性访问一个对象中的元素。
tips: 在R语言中下标是从1开始计数的,而并非是从0开始
①取逻辑性值得下标向量
下标向量x必须和被挑选元素得向量v长度一致。
> v <- c(1:5,NA)
> v
[1] 1 2 3 4 5 NA
> x <- !is.na(v)
> x
[1] TRUE TRUE TRUE TRUE TRUE FALSE
> v1 <- v[x] #v1是一个含有 v 中不是缺失值且元素次序不变的对象
> v1
[1] 1 2 3 4 5
> (v+1)[(!is.na(v)& v>0)] #将v中的向量都加一,并返回不是缺失值且大于0的对象
[1] 2 3 4 5 6
②取整数值的下标向量
下标为正整数时,代表取次序一致的元素;下标为负整数时,代表排除对应次序的元素:
> v[1:4]
[1] 1 2 3 4
> v[-2]
[1] 1 3 4 5 NA
3.取字符型值得下标向量
在定义向量时可以为元素加上名字,这样的向量可以用元素的名字来访问元素:
> apartment <- c(1,2,3)
> names(apartment) <- c('chenyu','zhaoxuan','shunshun') #为元素加上名字
> apartment
chenyu zhaoxuan shunshun
1 2 3
> xiu <- apartment['shunshun'] #使用元素名字访问‘shunshun’
> xiu
shunshun
3
因子
因子(factor)为处理分类数据提供了一种有效方法,它是对一个等长的其他向量元素进行分类(分组)的向量对象,主要适用于离散型随机变量。
factor()函数用来把一个向量编码为因子,其一般形式为:
factor(x=character(), levels, labels=levels, exclude=NA, ordered=is.ordered(x))
x是向量,levels是水平,lavels可以用来指定各水平的标签,exclude用于指定要转换为缺省值NA的元素集合,ordered为TRUE表示因子水平为有序
> class <- c(1,2,2,3,5,1,2,3,5,1,2,3,5,1,2,3)
> f <- factor(class)
> f
[1] 1 2 2 3 5 1 2 3 5 1 2 3 5 1 2 3
Levels: 1 2 3 5
> f <- factor(class,labels = 'class')
> f
[1] class1 class2 class2 class3 class4 class1 class2 class3 class4 class1 class2 class3 class4 class1 class2 class3
Levels: class1 class2 class3 class4
levels()函数
可以得到因子向量的水平,table()函数
可以统计各个水平数据的频数
tapply()函数
可以按照因子向量的水平 分组计算统计量:
tapply(x, INDEX, FUN=NULL, ... , simplify=TRUE)
x是对象,通常是一个向量,INDEX是因子向量(如果不是,自动转换为因子向量),FUN是需要计算的函数,如mean,sum,range等,simplify取TRUE则代表在一行内显示计算结果,否则分行。
tapply()的功能是对向量x按因子向量INDEX的水平分组计算函数FUN
在这里插入代码片
数组和矩阵
数组(array),可以看成带有多个下标类型相同的元素集合,array数组的构造具体格式为:
array(data= , dim=length(data), dimnames= )
data是一个数据向量,dim为维度向量,是一个正整数向量,表示数组各维的长度,dimnames代表各维度名字,默认为空。
> x <- array(1:20,dim=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
> x[2:3,1:4]
[,1] [,2] [,3] [,4]
[1,] 2 6 10 14
[2,] 3 7 11 15
矩阵(matrix)
矩阵,就是二维的数组。
矩阵除了用array()生成外,通常用matrix()函数,其格式为:
matrix(data= ,nrow=1, ncol=1, byrow=FALSE, dimnames=NULL)
data是数据向量,nrow代表行数,ncol代表列数,byrow代表是否按行放置矩阵的数据,dimnames代表数组维的名字。
> matrix(c(1:9),nrow=3)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> matrix(c(1:9),nrow=3,byrow = TRUE)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
矩阵的运算
①对维数相同的矩阵可以进行四则运算(+ - * /),此时进行的是矩阵对应元素的四则运算
②常见的矩阵运算符和函数:
功能 | 符号或函数 |
---|---|
矩阵的乘法 | %*% |
矩阵的转置 | t() |
矩阵求逆运算 | solve() |
矩阵求特征值和特征向量 | eigen() |
矩阵的行列式 | det() |
创建对角矩阵 | diag() |
对矩阵A进行奇异值分解 | svd(A) |
与数组(矩阵)运算的相关函数
①维度及维名字
dim()函数可以用于计算矩阵的维数,dimnames()用于获取矩阵的维的名字,同时也可以利用该函数对A的维进行命名。
> d <- matrix(c(1:12),3,4)
> d
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> dim(d)
[1] 3 4
> dimnames(d)
NULL
> dimnames(d) <- list(c('1','2','3'),c('x1','x2','x3','x4'))
> d
x1 x2 x3 x4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
此外,nrow()和ncol()函数
可以用于获取矩阵的行数和列数;rownames()和colnames()
用于获取行名和列名
②数组(矩阵)的合并与拉直
1.如果A是矩阵,则可以使用as.vector(A)将A矩阵拉直为向量。
rbind()表示按行上下合并向量或矩阵,cbind()表示按列左右合并向量或矩阵。
> m1 <- matrix(c(1:6),2,3)
> m1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> m2 <- matrix(c(7:12),2,3)
> m2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
> rbind(m1,m2) #按行上下来进行合并
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[3,] 7 9 11
[4,] 8 10 12
> cbind(m1,m2) #按列左右来进行合并
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 5 7 9 11
[2,] 2 4 6 8 10 12
> as.vector(cbind(m1,m2))
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> c(cbind(m1,m2))
[1] 1 2 3 4 5 6 7 8 9 10 11 12
列表和数据框
列表
R的列表是一个以对象的有序集合构成的对象。列表中包含的对象又称为分量,分量可以是不同的类型。
列表中分量会被编号,可以利用编号进行访问,例如list[2]
代表列表中第2个元素,也可以使用$符号进行访问,可以使用c()函数
将多个列表链接为一个大的列表:
> list1 <- list(name='chenyu',children=3,children.ages=c(4,7,9))
> list1[2]
$children
[1] 3
> list1$children.ages
[1] 4 7 9
> list2 <- list('xiaojin',age=20)
>
> c(list1,list2) #将两个列表连接为一个大列表
$name
[1] "chenyu"
$children
[1] 3
$children.ages
[1] 4 7 9
[[4]]
[1] "xiaojin"
$age
[1] 20
数据框
数据框data frame 是特殊的列表对象,是一个属于"data.frame"类的列表。满足数据框的列表条件:
①分量必须是向量(数值,字符,逻辑)、因子、数值矩阵、列表或其它数据框
②在数据框中以变量形式出现的向量结构必须长度一致,矩阵结构必须有一样的行数
数据框的定义函数为data.frame()
完成,可以使用$符对数据框中元素进行访问。
此外,还可以使用attach()
函数,将数据框的变量链接到内存中,可以直接引用某个分量或运算
使用detach()
(无参数)即可取消链接。
> DF <- data.frame('value'=c(2.00,1.19,2.30,2.60,2.50),'class'=c('x','y','x','x','y'),'rank'=c(2,1,3,5,4))
> DF
value class rank
1 2.00 x 2
2 1.19 y 1
3 2.30 x 3
4 2.60 x 5
5 2.50 y 4
> attach(DF) #对数据框的变量进行链接
> log(value) #直接对其分量进行运算
[1] 0.6931472 0.1739533 0.8329091 0.9555114 0.9162907
数据框的分量名(此属性一定非空)由names()
访问,rownames()
可以定义各行的名字
当数据框、数组和列表在满足一定条件下,可以相互转换,函数为as.data.frame(), as.matrix(), as.array()
分别把已有对象转换为数据框、矩阵和列表。
参考教程:《数据分析与R软件(第二版)》