【R读书笔记】R语言读书心得2-基本数据结构
1.5 数据集的创建
我们使用R语言的其中一个目的就是对已知的数据集进行相关的处理。为了处理这些数据,我们需要把我们已经有的数据导入 到R进行分析以得到相应的结果。说到数据的导入,有三种方法:第一种就是直接在键盘上输入相关数据,而R语言的数据结构类型有向量、矩阵、数组、列表、因 子以及数据框这六种。这里,我先介绍一下这六种数据类型:
这里,我们很清晰的看见向量是一种一位的数据结构,而矩阵则是二维的数据结构,数据框是一种可以包含不同数据类型的矩阵,因此它也算是二维的;关于 数组,我相信大家学了C语言之后应该会有所认识把。在R语言当中,其数组的结构和功能也是类似的;列表,是R里最复杂的数据结构,是一种有序的结合体,并 具有对称性;因子,其实就是一个数据集里的成分,在创建矩阵、数据框的时候我们都经常用到因子这个东西。
简单的介绍完上面的数据结构,接下来我将一一介绍如何创建这些类型的数据集。
首先,我们讲一讲向量。在R语言中,我们经常使用c函数进行向量的创建。下面输入一串整数1-20:
a<-c(1:20)
a
当然,我们也可以1-20一个一个按顺序打上去,但这种方法我个人不建议。
接下来,我们输入一串无序的整数:
b<-c(7,4,11,34,45,6)
b
因此,一个向量里,数字不同的排序,则向量就不一样,具有有序性。
其实,我们可以对两个长度的向量进行加减乘除运算,实例如下:
ex1<-c(1,3,5,7,9)
ex2<-c(2,4,6,8,10)
ex1+ex2
ex1-ex2
ex1*ex2
ex1/ex2
这里,我们也可以使用类型于数组的方法进行元素查找。比如,在这个例子中,我们可以用ex1[]进行查找,而里面的范围则是这个向量的长度;例如,我们要找ex1向量的第3个元素,则,可以如下操作:
ex1[3]
当然,我们也可以输入字符串向量,并把向量组合起来,实例如下:
a<-c("one")
b<-c('two')
c(a,b)
其它相关操作可以参考帮助文档。
接下来,我们讲讲矩阵。我们在学习线性代数的时候,我们一般把空间向量的变换用矩阵来表示。在R里,我们可以用matrix函数进行矩阵的创建,下面,我们先用帮助文档看看矩阵是怎样操作的:
help(matrix)
这 里,我们看到matrix里,首先需要输入数据集,其次是后面的nrow,ncol,分别代表这个矩阵式多少行,多少列;byrow和bycol代表矩阵 是否由行或列来填充。,dimnames就是矩阵每个维度的名字,而这里,我们可以使用因子输入到矩阵的行列名称中。is.matrix(x)、 as.matrix(x)分别代表判断x数据集是否是矩阵以及把x数据集转换成矩阵的类型。
下面,我们开始创建我们的矩阵。首先,我们用rnorm()函数取随机24个符合正态分布的随机数,然后把它放入s数据集后进行矩阵创建。具体过程如下:
r1<-rnorm(24)
matrix1<-matrix(r1,nrow=6,ncol=4)
matrix1
当然,我们还能对各个矩阵进行命名,还是以上一个矩阵为例,添加其名称,并在命名时使用列表把各名称整合起来,过程如下:
rn<-c("r1","r2","r3","r4","r5","r6")
cn<-c("c1","c2","c3","c4")
matrix3<-matrix(r1,nrow=6,ncol=4,
dimnames=list(rn,cn))
matrix3
这里,我们同样能对相同形状的矩阵进行加减乘除运算,这里,我只示范加法:
matrix1+matrix3
在矩阵中,我们也能用类似的方法查找,而关于此实例如下:
matrix1[2,] #查找矩阵第2行所有元素
matrix1[,3] #查找矩阵第3列所有元素
matrix1[4,4] #查找矩阵第4行第4列的元素
matrix1[1,c(2,3)] #查找第1行第2列和第3列的元素
现在,我介绍一下数组的相关操作。在R语言中,我们常常用array()函数进行数组的创建。当然,我们首先查看一下array()函数是怎么操作的:
help(array)
这里,我们看到array()基本需要输入数据集、维度和维度名称,这就是data、dim和dimnames所表示的内容。下面,我们分析这一的一个实例:
r3<-rnorm(24)
dim1<-c("r1","r2","r3")
dim2<-c("c1","c2","c3","c4")
dim3<-c("h1","h2")
array1<-array(r3,c(length(dim1),length(dim2),length(dim3))
,dimnames=list(dim1,dim2,dim3))
array1
这里,我再次创建一个含有24个符合正态分布的随机数的数据集,然后分别以dim1、dim2、dim3的长度进行维度向量创建。这里,我们用 length()函数求出dim1、dim2、dim3这3个向量的长度,于是,我们创建了一个3行、4列、2个层次的数组,为每个维度的名字也通过列表 的方式整合了起来。当然,as.array()和is.array()类似于矩阵的as.matrix()和is.matrix()。
接下来,我们来学习一下数据框。之前我简单的介绍了一下数据框,它的本质还是一种矩阵,只不过每行或每列都允许各类型的数据出现而已。在R语言当中,如果我们从外部导入了数据,其格式一般都是数据框的格式,而数据的导入和导出我会在后面的一节详细的介绍。
其实,创建一个数据框,其本质和创建一个矩阵是一样的。不过,其函数和用法还是有点区别的。在R,我们会用data.frame()函数创建一个数据框。在创建数据框之前,我们先用help()函数看一下其用法:
help(data.frame)
关于数据框的定义,在帮助文档已经说的很清楚,如果你英语不好,看不懂它讲什么,你就知道数据框的本质就是一种特殊的矩阵就好了。
从 帮助文档中,我们可以看到以下的一些参数,…代表是要创建数据框的时候所需的变量,row.names就是代表一列里每一行的名字,check.rows 就是查看每一行是否在长度和名字上一致,check.names代表名字里的每个变量是否是语法上的有效变量名,而stringAsFactors代表是 否把里面的字符向量转换成因子的形式,其默认情况是TRUE,即,一般情况下,所有的字符向量都会被转换成因子的形式。
现在,我们开始创建一个数据框。这次,我们可以把病人的基本信息以数据框的格式输入到R里,其过程如下:
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata
就这样,关于这4为患者的基本形式展现在我们的面前。当然,我们也可以改变每一列的变量名,其过程如下:
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(ID=patientID, a=age, d=diabetes, s=status)
patientdata
这种写法也是没问题的,不过这样的信息排版和展示效果就比上一个差了不少,不过也无关紧要,毕竟我想表达的,就是在某些情况下,如果你觉得其原始变量名可读性比较差的话,可以把部分变量名修改成可读性较强的变量名,而这个就需要看你的实际情况了。
当然,你也可以把它当作是一种矩阵操作来使用。下面,用创建数据框的方式创建一个矩阵:
a<-c(1:5)
b<-c(6:10)
m1<-data.frame(a,b)
m1
接下来,我们对刚刚创建好的数据框进行索引操作。数据框的索引类似于之前所讲的索引操作,也是变量名后面输入具体的索引信息。现在,我们先看看这个数据框的ID的情况:
patientdata$patientID
当然,我们刚刚也看到了我们之前所创建的数据框,也可以进行这样的操作:
patientdata[,1]
其实,数据框里的ID信息存储在第一列中,所以,我们对这个数据库的第一列进行索引就能得到患者的ID信息了。当然,我们也可以针对多行多列进行操作,其相关实例如下:
patientdata[1:2,2:3]
这个实例的索引内容就是对这个数据库第一和第二行的第二列和第三列进行索引,而结果给我们展示的则是患者1,患者2的年龄和患病类型,说明了我们要查找的信息则是患者1患者2的年龄和患病类型。
如果在索引的过程中,你不想看到看到一部分信息,你也可以在索引的行标号或列标号前添加一个-号,下面我就讲一个实例:
patientdata[-2:-3,]
这里,我们只想查看患者1和患者4的相关信息,因此,我们写了patitentdata[-2:-3]来排除患者2和患者3的相关信息。
其实,我们还可以把索引的内容以表格的形式展示出来。这里,我们用table()函数实现这样的操作,相关实例如下:
table(patientdata$patientID,patientdata$diabetes)
这里,我们看到1代表就是某个患者患了哪种病,也就是说,除了患者2是患有第2种类型的疾病以外,其它患者都患了类型1种类型的疾病。
接下来,我还再讲一下如何向一个已有的数据框里添加新的数据呢?
其中一种方法就是可以由已有的数据框和相关的一个或多个独立的向量组建一个新的数据框,而另一种方法就是在原来的基础上,添加新的列,并把它赋值给原来的数据框。下面,我们通过数据框增加新的数据来查看病人住院的情况,其过程如下:
day<-c(2,3,1,3)
data.frame(patientdata,day)
patientdata<-data.frame(patientdata,day)
Patientdata
就这样,我们可以看到,我们已经成功的把病人在医院里住了多少天这一信息添加到了展示患者信息的数据框中。从新的数据框看,这4位患者住院的天数分别为2天、3天、1天、3天。
接下来,我介绍一下attach()函数。attach()函数主要作用在于获得访问系统内数据框的权限,使之我们可以对此进行相关操作。下面,我们调用一下啊mtcars数据集:
attach(mtcars)
然后,我们对部分变量进行可视化操作:
plot(mtcars$mpg, mtcars$wt)
其实,attach(mtcars)以后,我们可以直接这样写:
attach(mtcars)
plot(mpg,disp)
plot(mpg,wt)
detach(mtcars)
其中,detach()函数就是撤销某一数据集,使之不能被搜索。关于attach()和detach(),你们可以详细查阅一下帮助文档。
当然,在某些情况下,我们想要对某个数据框进行一定的时候,比如,给mpg变量添加3个数据集,那么,我们要怎么做呢?在R中,我们可以使用with()函数进行数据框的修改操作。这里,我们先看看帮助文档:
这里,它就说到了with()函数就是对原始的数据进行修改的函数。而里面,我们只需要把原始数据已经要修改的方法写入with()就能达到修改数据的目的了。下面,我们看看with()的相关实例:
with(mtcars, {
summary(mpg, disp, wt)
plot(mpg, disp)
plot(mpg, wt)
})
这个实例就是我们之前作图的新方法,而想要在里面创建相关数据,首先,一下的这个方法是不可以的:
with(mtcars, {
stats <- summary(mpg)
stats
})
stats
在这种情况下,我们不能单独运行stats。如果想要某一变量能单独运行,这时,在with里面,我们需要使用(<<)符号,相关实例如下:
with(mtcars, {
stat<<-summary(mpg)
})
stat
这样,我们就达到了在with里创建新的变量和数据的目的了。接下来,我们不妨试一试在mpg里插入3个值:
with(mtcars, {
s<-c(mpg,c(20,30,50))
stat<<-summary(s)
})
stat
很明显,之前的最大值是33.9,当我们把50插进去以后,其最大最变为50,而平均值,也从20.09增大到21.23,其它的值的变化可以你可以从那两张图比较就能得出。
好了,在常见的R语言数据结构中,因子也是相当重要的。因子,其实就是数据结构中的元素、变量、分类、枚举类型等等的变量。在R语言中,我们常用因 子对数据集里的数据进行分类,而后进行汇总;而且,系统提供了factor()函数来给我们创建因子向量。在下面一个例子中,我们通过创建一个数据框来展 示一下factor()函数是怎么用的。
ID<-c(10,11,12,13)
Age<-c(23,24,25,25)
sex<-c("m","m","f","f")
height<-c("short","tall","tall","short")
Sex<-factor(sex)
Height<-factor(height)
info<-data.frame(ID,Age,Height,Sex)
str(info)
summary(info)
这时,我们看到了,身高和性别均被转换成因子类型,并在summary()中,我们看到身高的高矮和性别的男女的数量分别为2。
最后,我们学习一些列表。列表在R语言中是最复杂的数据结构类型,它是各种变量聚集在一起的结果。在R语言中,我们可以用list()创建列表向量,相关实例如下:
a<-"My first love"
b<-c("F","F","M","M")
c<-factor(b)
d<-c(30,30,31,31)
e<-matrix(1:10,nrow=5,byrow=T)
mylist<-list(title=a,b,c,d,e)
mylist
我们看到,我们所创建的列表聚集了各种类型的变量。下面,我们对列表进行相关的索引操作:
mylist[4]
mylist[[5]]
mylist["title"]
从这里,我们看到这3种索引方法都能把相关结果找出来。
数据人网第一期干货《机器学习基石》链接: http://pan.baidu.com/s/1skBc3YP 密码: q34y
数据人网是数据人学习、交流和分享的平台http://shujuren.org,专注于从数据中学习。
点击【阅读原文】,阅读更多精彩内容。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!