哈佛R语言课程--5.数据框、矩阵、列表取子集

学习目标

  • 演示如何从现有的数据结构中取子集,合并及创建新数据集。
  • 导出数据表和图以供在R环境以外使用。

1.数据框

数据框(和矩阵)有2个维度(行和列),要想从中提取部分特定的数据,就需要指定“坐标”。和向量一样,使用方括号,但是需要两个索引。在方括号内,首先是行号,然后是列号(二者用逗号分隔)。以metadata数据框为例,如下所示是前六个样本:

meatdata

例如:

metadata[1, 1]   # element from the first row in the first column of the data frame
metadata[1, 3]   # element from the first row in the 3rd column

现在,如果只想选择行,可以提供行的索引,将列索引留空。关键是要写逗号,让R知道你正在访问二维数据结构:

metadata[3, ]    # vector containing all elements in the 3rd row

如果从数据框中选择特定列,则行保留为空白:

metadata[ , 3]    # vector containing all elements in the 3rd column

像向量一样,也可以一次选择多行多列。在方括号内,提供所需值的向量:

metadata[ , 1:2] # dataframe containing first two columns
metadata[c(1,3,6), ] # dataframe containing first, third and sixth rows

对于较大的数据集,不易记住与特定变量对应的列号。在某些情况下,如果使用的脚本添加或删除列,则变量的列号可能会更改。因此,最好使用列名来引用特定变量,这样可以使代码更易于阅读,并且您的意图更加清晰。

metadata[1:3 , "celltype"] # elements of the celltype column corresponding to the first three samples

还可以使用$符号选择特定列,对特定列执行操作。在这种情况下,整个列是向量。例如,要从metadata数据集中提取所有基因型,可以使用:

metadata$genotype 

可以用colnames(metadata)names(metadata)显示列名称。然后我们可以提供索引以从该向量中选择特定值。例如,如果我们想要前五个样本的基因型信息metadata

colnames(metadata)

metadata$genotype[1:5]

$允许你通过名称来选择一列。要按名称选择多个列,需要连接与列名对应的字符串向量:

metadata[, c("genotype", "celltype")]

          genotype celltype
sample1        Wt    typeA
sample2        Wt    typeA
sample3        Wt    typeA
sample4        KO    typeA
sample5        KO    typeA
sample6        KO    typeA
sample7        Wt    typeB
sample8        Wt    typeB
sample9        Wt    typeB
sample10       KO    typeB
sample11       KO    typeB
sample12       KO    typeB

虽然没有等效的$语法来按名称选择行,但可以使用行名称选择特定的行。要查看行的名称,用rownames()函数:

rownames(metadata)

metadata[c("sample10", "sample12"),]

选择使用带有逻辑运算符的索引

对于与向量类似的数据集,我们可以使用数据集中特定列的逻辑向量来仅选择数据集中的行,其中TRUE值与逻辑向量中的位置或索引相同。然后用逻辑向量返回数据框中的所有行,其中这些值为TRUE。

idx <- metadata$celltype == "typeA"

metadata[idx, ]

使用which()函数选择具有逻辑运算符的索引

which()函数可以返回逻辑表达式为TRUE的索引。例如,metadata数据框中celltypetypeA的行:

idx <- which(metadata$celltype == "typeA")

metadata[idx, ]

或者提取metadata重复2和3的索引:

idx <- which(metadata$replicate > 1)

metadata[idx, ]

将此输出保存到变量:

sub_meta <- metadata[idx, ]


练习

metadata数据框取子集,返回基因类型为KO的行。


注意:有更简单的方法可以使用逻辑表达式对数据帧进行子集化,包括filter()subset()函数。这些函数将返回逻辑表达式为TRUE的数据帧的行,允许我们在一个步骤中对数据进行子集化。我们将filter()在后面的课程中更详细地探讨该功能。

2.列表

从列表中选择组件需要略有不同的表示法,即使理论上列表是向量(包含多个数据结构)。要选择列表的特定组件,您需要使用双括号表示法[[]]。使用之前创建的list1,并索引第二个组件:

list1[[2]]

你看到控制台上输出了什么?使用双括号表示法对于访问各个组件同时保留原始数据结构非常有用创建此列表时,我们知道我们最初在第二个组件中存储了一个数据框。通过class功能,可以检查提取后是否是数据框:

comp2 <- list1[[2]]
class(comp2)

还可以通过后接方括号来引用组件内部的内容。例如,在第一个组件中,我们存储了一个向量。

list1[[1]]

[1] "ecoli" "human" "corn" 

引用该向量的第一个元素,使用:

list1[[1]][1]

[1] "ecoli"

也可以对数据框和矩阵执行相同的操作,但是对于较大的数据集,建议不要这样做。相反,最好将列表组件的内容保存到变量(如上所述)并进一步操作它。此外尤其要注意,在选择组件时,我们一次只能访问一个组件。要访问列表的多个组件,请参阅下面的注释。

注释:使用单括号表示法也适用于列表。不同之处在于检索的信息类别。使用单括号表示法list1[1]将以列表形式而不是原始数据结构返回内容。这种表示法的好处是它允许通过向量进行索引,因此您可以一次访问列表的多个组件。


练习

让我们练习检查清单。创建一个名为random的列表,包含组件:metadataagelist1samplegroup,和number

  1. 打印出samplegroup组件中存储的值。

  2. metadata列表的组件中提取celltype列。从celltype值中仅选择最后5个值。


为列表中的组件命名有助于识别每个列表组件包含的内容,也更容易从列表组件中提取值。

列表的组件命名数据框的列命名使用的函数都是names()

查看list1组件的名称:

names(list1) 

创建列表时,将species向量与数据集df和向量number组合在一起。用原始名称给组件命名:

names(list1) <- c("species", "df", "number")

names(list1)

命名了列表组件后,可以使用$来提取组件,与数据框提取列相似。要使用名称提取组件,使用list_name$component_name

从列表中提取df数据框list1

list1$df

现在有三种方法可以从列表中提取组件。从list1中提取species

list1[[1]]
list1[["species"]]
list1$species


练习

练习结合从目前为止我们所讲过的数据结构中提取数据的方法:

  1. 设置在上一个练习中创建的列表random的名称。
  2. random列表中提取向量 age的第三个元素。
  3. random列表中的数据框 metadata中提取基因型信息。

3.导出文件

到目前为止只修改了R中的数据; 文件保持不变。想要将数据集保存到文件,需要使用函数write

要以逗号分隔的格式(.csv)将矩阵导出为文件,可以使用write.csv函数。有两个必需参数:要导出的数据结构的变量名称,以及要导出到的路径和文件名。默认情况下用逗号分隔列:

write.csv(sub_meta, file="data/subset_meta.csv")

与读取数据类似,有多种功能可供用户以特定格式导出数据。write.table也是常用的导出函数,允许用户指定要使用的分隔符。此函数通常用于创建制表符分隔的文件。

注意:有时在将具有行名称的数据框写入文件时,列名称将从行名称列开始对齐。为避免这种情况,可以在导出文件时设置参数col.names = NA,以确保所有列名称都与正确的列值对齐。

将向量写入文件需要与数据框的函数不同。使用write(),例如:

write(glengths, file="data/genome_lengths.txt", ncolumns=1)


用于数据处理的R包

上面介绍的方法使用基本R函数进行数据处理。稍后探索Tidyverse套件,专门用于简化数据处理。
微信公众号生信星球同步更新我的文章,欢迎大家扫码关注!


我们有为生信初学者准备的学习小组,点击查看◀️
想要参加我的线上线下课程,也可加好友咨询🔼
如果需要提问,请先看生信星球答疑公告

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349