今天主要学习两个数据类型:向量和数据框。下面也只是展现了最基础的操作,以后将在学习的过程中慢慢补充。
向量
向量的概念
在R语言当中,元素指代的是字符串、数字等数据类型,可分为标量和向量。向量提示我们它是有方向的,我们可以简单地将它定义为一排有序排列的元素。而标量则可以简单地理解为一个元素所组成的变量。向量的创建
我们可以通过如下的方式创建一个新的向量:
冒号:用于创建某个数到另一个数的序列,默认间隔为1;
c():用来拼接数值和向量;
vector():创建一个指定长度和类型的矢量,其中的结果可为0,FALSE,空字符串或是NULL,格式为vector("数据类型",长度)
创建指定类型的空矢量:等同于上面的vector:
numeric(长度)
:创建指定长度的0
complex(长度)
:创建指定长度的0+0i
logical(长度)
:创建指定长度的FALSE
character(长度)
:创建指定长度的空字符串
- 向量的序列
除了上述的方式外,我们还可以通过如下方式创建更为通用的序列:
seq():可以创建从一个数到另一个数的序列,可指定步长,格式为
seq(开始,结束,by= 步长 )
seq.int:与冒号类似创建一个从某个数到另一个数的序列,可指定步长,格式为seq.int(开始,结束,步长)
;
seq_len:创建一个从1开始到输入值的序列,格式为seq_len(输入值)
;
seq_along:创建一个从1开始,长度为输入值的序列,也就是说我们不必知道一个向量当中究竟有多少个元素,我们可以用此函数直接进行展示
> seq(1,5,by=2)
[1] 1 3 5
> seq.int(3,12,2)
[1] 3 5 7 9 11
> seq_len(8)
[1] 1 2 3 4 5 6 7 8
> x<-c(red=1,yellow=3,blue=5,green=7)
> seq_along(x)
[1] 1 2 3 4
- 向量的长度
所有的向量都有一个长度,用来表示这个向量包含多少个元素,我们可以用length()
函数进行查看。
注意:
缺失值(NA)也会被计算在长度当中;
字符串向量使用length()
时计算的是字符串的数目,而非每个字符串中字符串的长度。换句话说,统计的是有几个单词,而不是有有几个字母。如果想计算字母的个数,我们可以使用nchar()
函数
- 向量的索引
索引(也被成为子集、下标、切片等),指代的是我们寻找向量中的某一部分或者部分元素的过程,通常通过中括号[]来实现。我们可以在中括号中加入以下的内容:
正数:会从第一个元素开始计数,返回此位置上的向量元素;
如果[]的数字多于一个,我们要写成如x[c(1,3,5)]
这样的格式,也可以应用之前学过的冒号,写出x[c(2:4)]
这样的索引;
负数:会返回除了处于这些位置上的向量元素;
逻辑向量:会返回逻辑结果为TRUE的向量元素;
向量的名字:如果我们给向量中的每个元素进行了命名,将会返回包含这些名字的向量元素
在使用[]进行索引的过程中,也有一些需要注意的地方,包括:
① 不能混合使用正数和负数;
② 在[]中输入正数和逻辑值时也可以加上缺失值NA,得到的对应值也为缺失值。但是如果我们事先输入了负数,则[]中不允许出现缺失值NA;
③ []中出现超出矢量的长度的数值会返回缺失值NA;
④ 输入非整数,[]中的数值将自动向零舍入;
⑤ []中什么也不输入将返回整个向量
> x<-c(red=1,yellow=3,blue=5,green=7)
> x
red yellow blue green
1 3 5 7
> x[3]
blue
5
> x[-3]
red yellow green
1 3 7
> x["red"]
red
1
除了中括号,我们还可以使用which()
命令进行索引,它将返回逻辑向量中结果为TRUE 的元素。which.max()
和which.min()
命令则返回向量中数值最大或者最小的那个元素:
> a<-1:10
> which(a>5)
[1] 6 7 8 9 10
> which.max(a)
[1] 10
> which.min(a)
[1] 1
- 向量的重复
如果需要将一段向量进行重复的书写,可以用到rep(要重复的向量,重复几次)
函数,它的相关参数记录如下:
each=:每个元素均重复几次;
times=:每个元素分别重复几次;
length.out=:最终输出结果的长度
> rep(1:5,3)
[1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
> rep(1:5,each=3)
[1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
> rep(1:5,times=1:5)
[1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
> rep(1:5,length.out=7)
[1] 1 2 3 4 5 1 2
数据框
- 数据框的概念
在R语言中,除了向量以外还有很多看起来很像表格的数据格式,包括:
① 数组
② 矩阵
③ 列表
④ 数据框
元素类型角度:我们可以简单地理解为数组和矩阵需要当中的元素是同一类型的,比如都是数字;列表和数据框更接近我们实际当中的表格,可以包含不同的数据类型,就像我们可以在每一列当中分别写出姓名(字符串)、年龄(整数)、是否患病(逻辑)等。
维度的角度:数组和列表更复杂,可以进行更多维度的嵌套,而矩阵和数据框就像是我们平时在纸上画的那种简单的表格一样。
(当然,它们还有一些其他微妙的区别,以上只是自己比较笼统的概述。)
所以我们可以简单地将数据框看为是一种可以储存不同数据类型的矩阵,或是非嵌套的列表,其中每个元素具有相同的长度。
- 数据框的创建
一般我们都是从外部直接导入,很少直接自己在R语言中创建。创建的函数为data.frame()
。虽然每一列之间的数据类型可以不同,但是同一列的元素类型必须相同,下面是一个简单的例子:
> data_frame1<-data.frame(
+ x=letters[1:5],
+ y=rnorm(5),
+ z=runif(5)>0.5
+ )
> data_frame1
x y z
1 a -0.5983922 TRUE
2 b 1.5111653 FALSE
3 c -0.1976543 TRUE
4 d 0.1837754 TRUE
5 e -0.6396710 FALSE
> class(data_frame1)
[1] "data.frame"
其中列表为赋值时所给的x,y,z,而行名默认为数字从1开始排序。我们可以通过row.names=
这个参数对行名进行更改。
- 数据框的导入
有很多格式和文本类型的标准可用于存储数据,如何将它们导入到R语言当中变成R语言认识的格式,是进行数据分析的第一步。
对于类似电子表格的数据通常存储在逗号分隔值(CSV)和制表符分隔文件之中,我们可以用read.table()
进行读取,并将结果存储在数据框中。
而还有一些其他使用起来比较方便的read.table()
的亲戚,比如read.csv()
,它使用逗号作为小数位,并假定该数据有标题行。
其中一些常用的参数包括:
header=TRUE:将第一行作为标题行;
sep=‘某字符’:决定了使用哪个字符作为字段之间的分隔符,例如,sep='\t'
则使用制表符作为分隔符;
fill=TRUE:将用NA代替缺失的部分;
nrow:指定读取数据的行数;
skip:决定跳过文件开始的多少行
> huahua<-read.table(file = "huahua.txt",sep = '\t',header = T)
> huahua
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
> doudou<-read.csv("doudou.txt")
> doudou
X1 X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
- 数据框的行和列
为了了解我们得到的数据,我们首先要知道数据框当中的每一行和每一列都表示什么信息,我们可以用下面的函数来查看行名和列名:
> rownames(huahua) #查看行名
[1] "1" "2" "3" "4" "5"
> colnames(huahua) #查看列名
[1] "X1" "X2"
> dimnames(huahua) #查看行名和列名
[[1]]
[1] "1" "2" "3" "4" "5"
[[2]]
[1] "X1" "X2"
同样,我们还可以用上面的例子来进行行名列名的更改:
> colnames(huahua)[1]<-"bioplanet" #将第一列列名更改为bioplanet
> huahua
bioplanet X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
此外,为了了解数据的结构,我们还可以用下面的命令了解行数、列数:
> nrow(huahua) #看数据库有多少行
[1] 5
> ncol(huahua) #看数据库有多少列
[1] 2
> dim(huahua) #看数据库几行几列
[1] 5 2
- 数据框的导出
对数据框进行处理后,我们可以用下面的方式进行导出,其中最常用的函数为write.table()
,我们首先给出要导出哪一个数据框(huahua),再对导出的文件进行命名(day5.txt),sep参数更改分隔符为逗号,quote=F则取消字符串的双引号。我们首先按照下面命令进行运行:
> write.table(huahua,file="day5.txt",sep = ',',quote = F)
运行后,我们发现工作目录中多出了一个名为day5的txt文件:
- 数据框的索引
与矩阵的索引类似,数据框中也可以使用4种不同的向量索引(正整数、负整数、逻辑值和字符),在中括号[]中,[x,y]表示x行y列,下面的例子对这种索引方式进行了具体的阐释:
> huahua[1,2]
[1] 1
> huahua[1,]
bioplanet X2
1 A 1
> huahua[,2]
[1] 1 NA NA 3 NA
> huahua[,"X2"]
[1] 1 NA NA 3 NA
> huahua["X2"]
X2
1 1
2 NA
3 NA
4 3
5 NA
> huahua[c(2,4),2]
[1] NA 3
如果只选择单列的话,还可以使用美元符号$或者带有名称或正整数的双方括号[[]]:
> huahua$X2
[1] 1 NA NA 3 NA
> huahua[["bioplanet"]][2:3]
[1] B C
Levels: A B C D E
如果想要使用逻辑向量,我们可以可以用sebset函数非常简洁地给列加上条件筛选出来我们所需要的的那些列。subset()
共需要三个参数:一个数据框、一个行的逻辑条件、保留哪一列的名字(若省略则保留所有列):
> head(huahua)
bioplanet X2
1 A 1
2 B NA
3 C NA
4 D 3
5 E NA
> subset(huahua,X2>0,bioplanet)
bioplanet
1 A
4 D
反复使用数据框名的小技巧
在下面的例子中,我们反复使用到了数据框a这个变量。如果数据库名字比较长,则会显得很繁琐,这时,我们可以有一些小技巧来解决这个问题:
options(stringsAsFactors = T)
a <-data.frame(case=paste0("S",1:9),values=runif(9))
plot(a$case,a$values)
- attach
我们首先可以利用attach()
命令在搜索环境中添加数据框a,这样便可以不用再下一次使用a的时候再打出数据框的名字了。但是使用完成后务必记得用detach
命令退出,否则在有重名的变量、数据框时会很容易造成麻烦。
attach(a) #将数据框a添加到搜索环境中,以后我们再用a的时候不用再打它的全名了
plot(case,values)
detach(a)
- with
with函数也可以对需要反复输入的数据框变量名进行简化,它接受一个数据框和要计算的表达式作为输入参数:
with(a,{ #{}外面的a指明在哪个数据框当中进行操作
plot(case,values) #大括号里面的plot()的变量没有再使用a这个数据框名
x<<-summary(values) #求和并赋值给x,<<的意思是作为全局变量,也就是出了大括号仍有效。
})
变量的保存
如果有时候我们尚未完成工作,需要暂时保存一部分变量或者脚本,我们可以采用下面的方法。注意变量名的书写,否则会找不到目标的对象:
> save.image(file="bioinfoplanet.RData") #保存当前所有变量
> save(huahua,file="test.RData") #保存其中一个变量
而再次用到这些的时候,我们只需要输入下面的命令就可以了:
load("test.RData") #再次使用RData时的加载命令