专栏名称: 生信媛
生信媛,从1人分享,到8人同行。坚持分享生信入门方法与课程,持续记录生信相关的分析pipeline, python和R在生物信息学中的利用。内容涵盖服务器使用、基因组转录组分析以及群体遗传。
目录
相关文章推荐
51好读  ›  专栏  ›  生信媛

给女朋友写的生统资料_Part2

生信媛  · 公众号  · 生物  · 2019-06-16 18:41

正文

请到「今天看啥」查看全文


R里面有许多数据类型,跟生统课相关的就是数值型,字符型,逻辑型了。而R也有很多数据结构,包括标量、向量、矩阵、数组、数据框和列表等。跟生统课上相关的就是向量、数据框这两种了。

后面的一些内容会借鉴《R语言实战》中的内容,推荐大家可以去看看这本书的2.1 ,2.2部分。

向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。 同一向量中无法混杂不同模式的数据。 即不能把数值型、字符串型、逻辑型的混起来放入同一向量中。

让我们来创建一个向量

创建向量

a

查看向量的数据类型

class(a) class(b) class(c)

对于数值型的向量创建,使用 : 可以帮助我们直接创建多个数字。这一点对于我们后面在数据框里面提取数值很有帮助。

c(1:10) [1] 1 2 3 4 5 6 7 8 9 10

如果想要重复地创建某些值,就可以考虑 rep 函数。这一点对于后面我们给数据框添加列,或者添加列名行名可能会有帮助。

可以用?rep来查询其具体用法

rep("A",3) [1] "A" "A" "A" rep(c("A","B"),3) [1] "A" "B" "A" "B" "A" "B"

数据框

数据框是一个二维数据结构,有行和列。一般来说,我们会将行表示观测,列表示变量 数据框可以放入不同类型的文件

一般来说,生统中的数据框是不需要自己创建的,只需要读入就行。用 read.table 读进来就已经是个数据框了。

test1

head(test1) yield seed 1 383 1 2 406 1 3 351 1 4 400 1 5 390 1 6 361 1

我们可以对这个数据框进行一些探索。 首先看下这个数据框是几行几列的

dim(test1) [1] 29 2 nrow(test1) [1] 29 ncol(test1) [1] 2

发现是一个 29 X 2 的数据框。然后我们可以看下我们数据框的行名和列名是什么。

提取行名

rownames(test1) [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" [20] "20" "21" "22" "23" "24" "25" "26" "27" "28" "29"

提取列名

colnames(test1) [1] "yield" "seed"

我们也可以对行名和列名进行更改

colnames(test1)

当然我们也可以自己来创建一个数据框。用到的是 data.frame 函数。

R语言实战的例子

patientID

自己来一个例子

data.frame(A = c(rep(1,2),rep(2,2),rep(3,2)), B = rep("test", 6)) A B 1 1 test 2 1 test 3 2 test 4 2 test 5 3 test 6 3 test

需要注意的是,数据框跟列表不一样,数据框里面的每一列都必须是等长的。像我这里就是 2 个 A ,2 个 B , 2 个 C ,再加上 6 个 test 。 如果不等长就有可能会报错。也有可能不报错,用 NA 或者其他的值填充了。这个后面可能会提到。 因子 在我看来,因子的作用是为了对变量进行分类。就比如我们在做AONVA分析的时候,我们会做多种处理,那么我们就可以认为这些处理每个都是一类。拿上面的例子举例。

patientdata patientID age diabetes status 1 1 25 Type1 Poor 2 2 34 Type2 Improved 3 3 28 Type1 Excellent 4 4 52 Type1 Poor

这里的糖尿病类型 Diabetes,有两种类型,分别是 Type1 和 Type2 。病情Status 有三种类型,分别是 poor、 improved、 excellent。所以这两列所含有的数据就是因子型的数据。 值得注意的是,R在构建数据框的时候,会自动将所有字符串类型的值转换成因子。我们可以看下

patientdata$diabetes [1] Type1 Type2 Type1 Type1 Levels: Type1 Type2 patientdata$status [1] Poor Improved Excellent Poor
Levels: Excellent Improved Poor patientdata$patientID [1] 1 2 3 4

如果这里有 Levels ,就代表这里的数据是因子。可以看到,patientID由于是数值型的变量,所以并没有自动地转换成因子。 我们同样也可以用 class 来看下类别。

class(patientdata$diabetes) [1] "factor"

class(patientdata$patientID) [1] "numeric"

但有时候,字符串变量自动转换成因子也不是所有都对的,比如一开始我们有name这一列。

patientID

看下 names 的类别

class(patientdata$names) [1] "factor" patientdata$names [1] Paul James Wade Antony Levels: Antony James Paul Wade

我们会发现 R 自动地将 names 这一列也变成了因子。但实际上,名字是独一无二的,并不是一个分类变量。所以,我们不应当将其变成一个 factor 。不过,你会发现,如果是这一列是后添加上去的,就不会自动转成因子。

这个操作可以自动加上一列名为name_new的列

patientdata$names_new

patientdata patientID age diabetes status names names_new 1 1 25 Type1 Poor Paul Paul 2 2 34 Type2 Improved James James 3 3 28 Type1 Excellent Wade Wade 4 4 52 Type1 Poor Antony Antony

patientdata$names_new [1] "Paul" "James" "Wade" "Antony"

让我们再来看下我们在第五次生统作业的第一题的数据。

class(test1$yield) [1] "integer" class(test1$seed) [1] "integer"

明明我们的seed代表的是处理类别,为什么却不是一个因子呢。因为 seed 那一列是数值型的变量,所以 R 并不会自动地将其转换成因子。但如果不转换成因子的话,就可能会在后续的分析中出现一些问题。所以我们可以用 factor 函数,来将其转换成因子。

test1$seed

如果想要R不自动地将字符串转换成因子,可以

读数据的时候,设置

test1

自己构建数据框的时候,设置

patientdata

参考文章:

《R语言实战》第二章

如何理解R中因子(factor)的概念 中猴子的回答

作者:城管大队哈队长 链接:https://www.jianshu.com/p/69ffc71f8a4c








请到「今天看啥」查看全文