学习目标
- 构建数据结构以存储外部数据
- 查看R的数据结构
- 从数据结构中对数据进行子集化。
1.将数据读入R
无论要执行的R中的具体分析是什么,通常都需要导入数据用于分析。我们使用的R中的函数将取决于我们引入的数据文件的类型(例如文本,Stata,SPSS,SAS,Excel等)以及该文件中的数据如何分开或分隔。下表列出了可用于从常见文件格式导入数据的函数。
数据类型 | 后缀 | 函数 | 包 |
---|---|---|---|
逗号分隔值 | CSV | read.csv() |
utils(默认) |
read_csv() |
readr(tidyverse) | ||
制表符分隔值 | TSV | read_tsv() |
readr |
其他分隔格式 | 文本 | read.table() |
utils |
read_table() |
readr | ||
read_delim() |
readr | ||
Stata version 13-14 | DTA | readdta() |
haven |
Stata version 7-12 | DTA | read.dta() |
foreign |
SPSS | SAV | read.spss() |
foreign |
SAS | sas7bdat | read.sas7bdat() |
sas7bdat |
Excel | xlsx,xls | read_excel() |
readxl(tidyverse) |
例如,逗号分隔文本文件可以使用read.csv
函数。但是,如果数据在文本文件中由不同的分隔符分隔,我们可以使用泛型read.table
函数并将分隔符指定为函数中的参数。
基因组数据通常有一个metadata文件,其中包含有关数据集中每个样本的信息。用read.csv
函数读入metadata文件。查看函数的参数以了解函数选项:
?read.csv
read.csv
函数有一个必需参数和几个可选参数。必须参数是文件和文件名的路径,例如data/mouse_exp_design.csv
。我们将函数写在赋值运算符的右侧,则任何输出都将保存为左侧的变量名。
metadata <- read.csv(file="data/mouse_exp_design.csv")
注意:
read.csv
默认将包含字符(即文本)的列强制转换为factor
数据类型。根据用户要对数据执行的操作,如需将这些列保留为character
,可以设置read.csv()
和read.table()
的参数stringsAsFactors
为FALSE
。
2.检查数据结构
R有很多基本函数可用于检查数据并对其进行汇总。以测试数据metadata
为例。
输入变量名metadata
,回车来查看数据框; 变量中包含样本信息。每行包含单个样本的信息,列分别是有关样本genotype
(WT或KO), celltype
(typeA或typeB)和replicate number
(1,2或3)的分类信息。
metadata
genotype celltype replicate
sample1 Wt typeA 1
sample2 Wt typeA 2
sample3 Wt typeA 3
sample4 KO typeA 1
sample5 KO typeA 2
sample6 KO typeA 3
sample7 Wt typeB 1
sample8 Wt typeB 2
sample9 Wt typeB 3
sample10 KO typeB 1
sample11 KO typeB 2
sample12 KO typeB 3
文件行数更多时,不需要在控制台中显示所有内容,用函数head()
查看data.frame
的前6行:
head(metadata)
之前已经提到data.frame
默认使用字符值转换为因子。使用str
函数可以看到这种更改。str
显示每列的具体信息:
str(metadata)
'data.frame': 12 obs. of 3 variables:
$ genotype : Factor w/ 2 levels "KO","Wt": 2 2 2 1 1 1 2 2 2 1 ...
$ celltype : Factor w/ 2 levels "typeA","typeB": 1 1 1 1 1 1 2 2 2 2 ...
$ replicate: num 1 2 3 1 2 3 1 2 3 1 ...
可见,genotype
和celltype
列属于factor
类,而replicate列是整型。
您还可以从RStudio的“environment”选项卡中获取此信息。
数据检查函数列表
已经看到函数head()
和str()
可以查看data.frame
的内容和结构。以下是一个非详尽的函数列表,用于了解数据的内容/结构。
- 所有数据结构 - 内容显示:
-
str()
:紧凑的数据内容显示(环境) -
class()
:向量的数据类型(例如字符,数字等)以及数据帧,矩阵和列表的数据结构。 -
summary()
:详细显示,包括描述性统计,频率 -
head()
:将打印变量的开始条目 -
tail()
:将打印变量的结束条目
-
- 向量和因子变量:
-
length()
:返回向量或因子中的元素数
-
- 数据框和矩阵变量:
-
dim()
:返回数据集的维度 -
nrow()
:返回数据集中的行数 -
ncol()
:返回数据集中的列数 -
rownames()
:返回数据集中的行名称 -
colnames()
:返回数据集中的列名称
-
3.使用索引和序列选择数据
在分析数据时,我们经常要对数据进行分区,以便只处理选定的列或行。数据框或矩阵只是组合在一起的向量集合。因此,从向量开始,学习如何访问不同的元素,然后将这些概念扩展到数据框。
(1)向量
选择使用索引
从向量中提取一个或多个值,可以使用方括号[ ]
语法提供一个或多个索引。索引表示一个向量中的元素数目(桶中的隔室编号)。R索引从1开始。编程语言如Fortran,MATLAB和R从1开始计数,符合人类的思维模式。C系列中的语言(包括C ++,Java,Perl和Python)从0开始计算,因为这对计算机来说更简单。
创建一个名为age的向量:
age <- c(15, 22, 45, 52, 73, 81)
提取这个向量的第五个值,使用以下语法:
age[5]
提取除了这个向量的第五个值之外的所有值,使用:
age[-5]
如果我们想要选择多个元素,我们仍然会使用方括号语法,但不是使用单个值,而是传递几个索引值的向量:
idx <- c(3,5,6) # create vector of the elements of interest
age[idx]
要从向量中选择一系列连续值,我们将使用:
哪个是一个特殊函数,它以递增或递减顺序创建整数数字向量。让我们从年龄中选择前四个值:
age[1:4]
或者,如果您希望反向可以尝试4:1
例如,并查看返回的内容。
练习
- 使用以下字母C,D,X,L,F创建一个名为字母的向量。
- 使用关联的索引
[ ]
以执行以下操作:- 仅显示C,D和F.
- 显示除X外的所有内容
- 以相反的顺序显示字母(F,L,X,D,C)
选择使用带有逻辑运算符的索引
我们也可以使用带有逻辑运算符的索引。逻辑运算符包括大于(>),小于(<)和等于(==)。R中逻辑运算符的完整列表如下所示:
操作符号 | 描述 |
---|---|
> | 大于 |
> = | 大于或等于 |
< | 少于 |
<= | 小于或等于 |
== | 等于 |
!= | 不等于 |
& | 和 |
| | 或 |
使用逻辑表达式来确定特定条件是真还是假。仍以age向量为例:
age
想知道age向量中的每个元素是否大于50,可以使用:
age > 50
返回的是具有与age相同长度的逻辑值的向量,其中TRUE和FALSE值指示向量中的每个元素是否大于50。
[1] FALSE FALSE FALSE TRUE TRUE TRUE
使用这些逻辑向量仅选择具有与逻辑向量中相同位置或索引处的TRUE值的向量中的元素。
使用逻辑运算符创建索引,以选择age
向量中超过50 或 age
小于18的所有值:
idx <- age > 50 | age < 18
idx
age
age[idx]
使用which()
函数使用逻辑运算符进行索引
虽然逻辑表达式将返回相同长度的TRUE和FALSE值的向量,但我们可以使用该which()
函数输出值为TRUE的索引。使用任一方法建立索引都会生成相同的结果,使用哪种方法取决于个人偏好。例如:
idx <- which(age > 50 | age < 18)
idx
age[idx]
请注意,无论是否使用which()
,都会得到相同的结果。另请注意,虽然which()
与索引的逻辑表达式的工作方式相同,但它可以用于多个其他操作,它们不能与逻辑表达式互换。
关于嵌套函数的注意事项**:
idx
我们可以将逻辑运算和/或函数放在括号中,而不是先创建idx对象。
age[which(age > 50 | age < 18)]
与age[idx]
上面相同。
(2) 因子
由于因子是特殊的向量,因此索引选择值的相同规则适用于因子。之前创建的expression因子的元素具有以下level:low,medium,high。
让我们用高表达式提取因子的值,在这里使用嵌套:
expression[expression == "high"] ## This will only return those elements in the factor equal to "high"
嵌套说明:
上面的代码使用嵌套更有效; 使用了一步代替两步,如下所示:
Step1(无嵌套):
idx <- expression == "high"
Step2(无嵌套):
expression[idx]
练习
仅提取samplegroup
不是KO的元素(可选嵌套逻辑操作)。
因子的relevel
我们已经简要地讨论了一些因子,但只有在实战之后,这种数据类型才会变得更加直观。稍微绕道而行,了解如何在一个因素中重新定义类别。
要查看整数分配,可以使用str()
:
expression
str(expression)
Factor w/ 3 levels "high","low","medium": 2 1 3 1 2 3 1
这些类别被称为“因子水平”。如前所述,expression
因子中的级别按字母顺序分配整数,高= 1,低= 2,中等= 3。然而,如果low = 1,medium = 2和high = 3,对我们来说更有意义,即我们有必要“重新定位”这个因素中的类别。
要重新定义类别,可以将levels
参数添加到factor()
函数中,并为其提供一个向量,其中包含按所需顺序列出的类别:
expression <- factor(expression, levels=c("low", "medium", "high")) # you can re-factor a factor
str(expression)
Factor w/ 3 levels "low","medium",..: 1 3 2 3 1 2 3
重排序后,low为第一类,medium为第二类,high为第三类。这体现在它们在str()
中输出的方式以及在各个类别的编号在因子中的位置。
注意:当您需要将因子中的特定类别作为“基础”类别(即等于1的类别)时,需要重新调整。例如,将RNA-seq实验中的“对照组”作为“base” 。
练习
使用上节课创建的samplegroup 因子进行relevel,顺序是 KO、 CTL 、 OE。
微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!
我们有为生信初学者准备的学习小组, 点击查看◀️
想要参加我的线上线下课程,也可加好友咨询
如果需要提问,请先看 生信星球答疑公告