1.原子型向量
1.1原子型向量概况
1.是最简单的包含数据的向量
2可以生成一个只包含一个值的原子型向量,也可以用c函数将元素组合起来形成一个包含多个元素的原子型向量
3 length函数返回原子型向量的长度
4 is.vector()用来测试某个对象是否为原子型向量
> five<-5
> die<-c(1,2,3,4,5,6)
> is.vector(die) #判断是否为原子型向量
[1] TRUE
> length(die) #原子向量的长度
[1] 6
5.六种原子型向量:双整型、整型、字符型、逻辑型、复数类型、原始类型
注:输入整数值后键入一个L表示输入一个整型数值;给输入的字符加上“”
> int<-6L
> text<-"abc"
> int<-c(6L,5L)
> text<-("abc","def")
> sum(int)
[1]11
6.typeof()函数查看某个对象的类型
1.双整型
默认以双整形存储。可正可负,可大可小,可包含小数部分
2整型
整型,无小数。
明确设定整型:在数值后加上L。未加L默认双整型。
4L与4的唯一区别在于:存储方式
由于双整型的数值只保留到小数点后16位,会带来浮点误差
> sqrt(2)^2-2 #浮点误差,正常应该是0
[1] 4.440892e-16
3字符型
字符加引号;字符型向量中的单个元素称作字符串。
4.逻辑型
逻辑型向量用来存储TRUE和FALSE。R也会默认把T和K分别当做前两者的简写
> 3>4
[1] FALSE
> logic<-c(TRUE,FALSE)
> logic
[1] TRUE FALSE
> typeof(logic)
[1] "logical"
> typeof(TRUE)
[1] "logical"
5.复数类型和原始类型
复数类型向量:存储复数。要生成一个复数类型向量,只需将某个数字与带i的虚数项相加即可
> camp<-c(1+2i)
> camp
[1] 1+2i
> typeof(camp)
[1] "complex"
原始类型向量:用来存储数据的原始字节
1.2属性
属性是附加给原子型向量的额外信息,相当于对象的元数据,作用是将与这个对象相关的信息以一种便捷的形式存起来并附加给该对象;
原子型向量除非人为地加上一些属性,否则它不附带任何属性值;
用attributes函数可查看一个对象包含哪些属性信息;
> attributes(logic)
NULL
一个原子型向量最常见的三种属性:名称、维度、类
1.名称属性
1.1辅助函数:names(),可以查询对象的名称属性;也可以将一串字符向量赋给对象,作为它的名称属性值
其中,该字符向量长度应与对象等长,每个字符元素都对应对象中相应位置元素的名称。
> die<-1:6
> names(die) #查询
NULL
> names(die)<-c("one","two","three","four","five","six") #赋值
> names(die)
[1] "one" "two" "three" "four" "five" "six"
> attributes(die)
$names
[1] "one" "two" "three" "four" "five" "six"
1.2名称属性值不会对向量中的实际值产生影响,即便是改变了向量元素中的取值,名称属性值也不会改变
> die #名称属性值显示在对应元素的上方
one two three four five six
1 2 3 4 5 6
> die+1
one two three four five six
2 3 4 5 6 7
1.3 要更改名称属性,只要将新的名称赋给names函数即可
> names(die)<-c("a","b","c","d","e","f")
> die
a b c d e f
1 2 3 4 5 6
1.4一次性删除名称属性值,将NULL赋给names函数
> names(die)<-NULL
> die
[1] 1 2 3 4 5 6
2.维度属性
2.1 原子型向量可以转换成一个n维数组,方法是用dim函数将相应的纬度属性赋给该向量。dim(a,b),分配维度属性时,R始终将第一个值赋给行数,第二个值赋给列数。
> dim(die)<-c(2,3)
> die
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> dim(die)<-c(3,2)
> die
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.2重新排列时列优先,总是第一列排完再到第二列。如果想认为控制排列过程,可用辅助函数matrix或array,功能与dim同,但包含一些额外参数 【函数用法不同】
1.3矩阵 matrix
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)
nrow:行数 ncol:列数 设置参数byrow=TRUE,行优先【默认列优先FALSE】
> n<-matrix(die,nrow=2,byrow=TRUE)
> n
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
1.4数组 array
array(data = NA, dim = length(data), dimnames = NULL)
第一个参数为原子型向量,第二个参数dim为表示维度信息的向量。注:array没有matrix灵活,无法调整行优先,功能与dim类似。
> m<-array(die,dim=c(2,3))
> m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
ar<-array(c(11:14,21:24,31:34),dim=c(2,2,3)) #2行,2列,3层
> ar
, , 1
[,1] [,2]
[1,] 11 13
[2,] 12 14
, , 2
[,1] [,2]
[1,] 21 23
[2,] 22 24
, , 3
[,1] [,2]
[1,] 31 33
[2,] 32 34
练习
> puck<-c("ace","king","queen","jack","ten","spades","spades","spades","spades","spades")
> dim(puck)<-c(5,2) #用dim
> puck
[,1] [,2]
[1,] "ace" "spades"
[2,] "king" "spades"
[3,] "queen" "spades"
[4,] "jack" "spades"
[5,] "ten" "spades"
> puck<-c("ace","king","queen","jack","ten","spades","spades","spades","spades","spades")
> matrix(puck,nrow=5) #用matrix
[,1] [,2]
[1,] "ace" "spades"
[2,] "king" "spades"
[3,] "queen" "spades"
[4,] "jack" "spades"
[5,] "ten" "spades"
> matrix(puck,ncol=2)
[,1] [,2]
[1,] "ace" "spades"
[2,] "king" "spades"
[3,] "queen" "spades"
[4,] "jack" "spades"
[5,] "ten" "spades"
>
1.5类
改变对象的纬度不会改变其类型,但是会改变这个对象的class属性
> die<-1:6
> class(die)
[1] "integer" #原始的类
> dim(die)<-c(2,3)
> typeof(die)
[1] "integer"
> class(die)
[1] "matrix" "array" #后来的类
R中许多函数在处理对象时,会特意检查该对象的class属性,然后根据其class属性的不同再选用相应的处理方法
1.日期和时间
1.1 用Sys.time()函数范围计算机的当前时间
> now<-Sys.time()
> now
[1] "2023-11-21 10:52:29 CST"
> typeof(now)
[1] "double"
> class(now)
[1] "POSIXct" "POSIXt"
删除class属性 ——unclass()函数
> unclass(now)
[1] 1700535149
1.2将POSIXct赋值给任意一个R对象,1970年1月1日零点后的100万秒是哪一天?
> m<-1000000
> m
[1] 1e+06
> class(m)<-c("POSIXct","POSIXt") #类赋值
> m
[1] "1970-01-12 21:46:40 CST"
2.因子
2.1 因子在R中用来存储分类信息。
可以将因子视为与性别类似的概念,它只可取某些特定的值(男,女)。
2.2 向factor函数传递一个原子型向量即可生成一个因子。
工作原理:R会将向量中的值重新编码为一串整数值,再将编码的结果存储在一个整型向量中。R 还将一个levels属性和一个class属性添加到该整型向量中。
levels属性包含显示因子值的一组标签;class属性包含类factor。
> gender<-factor(c("male","female","female","male")) #生成因子
> typeof(gender)
[1] "integer"
> class(gender)
[1] "factor"
> attributes(gender) #查看两个属性
$levels
[1] "female" "male"
$class
[1] "factor"
> gender
[1] male female female male
Levels: female male
使用unclass函数可以看到R是如何存储因子的。
> unclass(gender) #unclass函数
[1] 2 1 1 2
attr(,"levels")
[1] "female" "male" #两个标签,1显示为female,2显示为male
2.3 因子的存在,使得在统计模型中加入分类变量更加简单,因为这些分类变量已经被编码成一些数值。但是,因子容易使人产生困惑,因为它看起来像是字符串,却表现为整数值
2.4用as.character函数将一个因子强制转换成字符串、R会讲因子的标签信息保存为一个字符串向量,摈弃内存中的整数值信息
> gender<-factor(c("female","male"))
> gender
[1] female male
Levels: female male
> as.character(gender)
[1] "female" "male"
练习
此时全部被转换为字符型,1无法进行运算:
> card<-c("ace","hearts",1)
> card
[1] "ace" "hearts" "1"
a.向量中的数据类型:
如果尝试把不同类型的数据都塞进一个向量,R会将它们全转换成同一种类型的数据。
b.原子型向量、矩阵、数组只能存储单一类型的数据
1.6强制转换
1.如何转换?
如果一个原子型向量包含字符串,R会将该向量中的所有元素都转换成字符型。如果一个原子型向量只包含逻辑型和数值型元素,R会将逻辑型全部转换为数值型:TRUE值转换为1,FALSE值转换为0。
2.逻辑运算时的强制转换
> sum(c(TRUE,FALSE,TRUE,FALSE)) #sum(c(1,0,1,0))
[1] 2
> mean(c(TRUE,TRUE,FALSE,FALSE))
[1] 0.5
所以,sum函数相当于是计算这个原子型向量包含多少个TRUE值(mean函数则会计算TRUE值在向量中所占的比例)
3.指定转换类型——as系列函数
> as.logical(1)
[1] TRUE
> as.character(1)
[1] "1"
> as.numeric(FALSE)
[1] 0
4.如何避免强制转换——新的对象类型:列表
1.7列表——全类型
1.概况
列表将数据组织在一个一维集合中,与原子型向量相似;但列表不是将某些具体的值组织起来,而是组织R对象,如原子型向量及其他列表
能够存储任何类型的数据
2.list函数创建方式
与c函数创建向量的方式相似,不同元素用逗号分开
> list1<-list(100:130,"heart",list(TRUE,FALSE))
> list1
[[1]]
[1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
[19] 118 119 120 121 122 123 124 125 126 127 128 129 130
[[2]]
[1] "heart"
[[3]]
[[3]][[1]]
[1] TRUE
[[3]][[2]]
[1] FALSE
练习
> card<-list("ace","hearts",1)
> card
[[1]]
[1] "ace"
[[2]]
[1] "hearts"
[[3]]
[1] 1
1.8数据框——更简便,全类型
1.概况
数据框是列表的二维版本;数据框中的每一列都可以用来存储一种类型的数据,列与列之间的数据类型可以不同,但是每一列中的所有元素都必须是同一种类型的数据
2.data.frame函数手动创建数据框。
将任意数量的向量交给该函数,每个向量之间用逗号隔开,且每个向量都有自己的名称(用以描述该向量的信息)
> df<-data.frame(face=c("ace","two","six"),suit=c("clubs","clubs","clubs"),value=c(1,2,3))
> df
face suit value
1 ace clubs 1
2 two clubs 2
3 six clubs 3
确保每个向量长度相同(或在R的循环规则下可以变成等长向量)
3.名称
在创建列表或向量时,也可为其命名
> list1<-list(face="ace",suit="hearts",value="1")
> list1
$face
[1] "ace"
$suit
[1] "hearts"
$value
[1] "1"
4.数据框的类型、类
数据量的一个具有data.frame类的列表。可以用str函数查看在这个列表中哪些对象被组织在一起
> typeof(df)
[1] "list"
> class(df)
[1] "data.frame"
> str(df)
'data.frame': 3 obs. of 3 variables:
$ face : chr "ace" "two" "six"
$ suit : chr "clubs" "clubs" "clubs"
$ value: num 1 2 3
可以看到,此处R将字符串存储成了因子。若想避免可以在data.frame语句中添加参数stringAsFactors=FALSE
5.str()函数查看对象的结构和组成的函数
str()
函数是用于查看对象的结构和组成的函数。它可以提供关于对象的基本信息,包括对象的类型、维度、成分等。
例如,如果有一个数据框df,通过使用str(df)
,可以得到数据框的一些基本信息,如变量名称、数据类型、数据长度等。
1.9加载数据
在向导界面取消选择Strings as factors,这样做是让R以字符串变量类型加载字符串变量。如果不这样做,R会将这些字符串变量强制转换出因子型
head()
可以在控制台中用head()命令检查导入的数据框
head()和tail()是用于快速检视大型数据集的两个很好用的函数。head用于检视数据集的前六行数据,而tail返回数据集的最后六行数据;
指定参数可查看其他行数的数据,如head(deck,10)用于检视前10行的数据
> head(deck)
face suit value
1 king spades 13
2 queen spades 12
3 jack spades 11
4 ten spades 10
5 nine spades 9
6 eight spades 8
1.10保存数据
1.用write.csv命令将任意一个数据框保存为.csv文件。
三个必要参数:指明所保存的数据框的名字(带拓展名);添加参数row.names=FALSE,避免R在存储数据是,在数据框的开头加一列数字
> write.csv(deck,file="cards.csv",row.names=FALSE)
1.11小结
在本章你学会了如何在R中存储数据;第四章将会介绍在存储值之后如何访问这些值。你还将自己编写两个用于使用扑克牌的函数:一个用于洗牌,一个用于发牌