r语言 c d生产函数,R语言系列第一期(番外篇)R的6种对象

原标题: R语言系列第一期(番外篇)R的6种对象

本文首发于“百味科研芝士”微信公众号,转载请注明:百味科研芝士,Focus科研人的百味需求。

功能介绍 高端大气基金标书,系统全面R和统计; 深入浅出生信神器,实用百变科研工具; 热气腾腾时事资讯,诙谐有趣医学科普; 此号可知科研百味,分享干货玩转芝士

6d12da16c0f88f6183ed57e4b279ecb8.png

前文我们讲到R处理数据面对的6种对象:向量,矩阵,数组,因子,列表,数据框。

A. 那我们就得好好给大家介绍一下这位能者的6个对象都长什么样子了。

· 1.向量 ·

向量大体上分为3种,数值向量,字符向量,逻辑向量。(单个向量内元素类型必须一致)

数值向量:

> c(1,2,3,4,5,6,7)

[1] 1 2 3 4 5 6 7

字符向量(字符向量使用单引号和双引号都可以,但是每个对称的引号必须一致):

> c('a','b','c','d')

[1] "a" "b" "c" "d"

逻辑向量(若想要把true和false写全,输入逻辑字符时就必须全部大写”TRUE”,”FALSE”):

> c(T,F,T,F,T)

[1] TRUE FALSE TRUE FALSE TRUE

生成向量的常用函数有:c()、seq()、rep()

第一个不需要解释了,其实就是 ”concatenate” 的缩写。各个元素之间需要用 ”,” 隔开。

#Tips : c() 可以嵌套 c() ,如果是字符元素不加引号的话,会默认为变量。例:

> c(c(1,2),3,4,5)

[1] 1 2 3 4 5

> a

> c(a,5,6)

[1] 1 2 3 5 6

seq() 函数是建立数字等差序列,其第一个参数是开始值,第二个参数为结束值,第三个参数为步长(不明确的情况下,默认为 1 ,如果步长为 1 ,可以用:代替),如:

> seq(5,11,2) ( 从 5 到 11 ,步长是 2)

[1] 5 7 9 11

> 12:18

[1] 12 13 14 15 16 17 18

rep()函数是输出重复值,有两个参数,第一个参数是被重复的元素组合,第二个参数是重复次数/对应位置的元素重复次数。例(如果第二个参数是一个值,那么表示前一个参数整体重复的次数,如果是一个向量,那么就代表前面对应的位置的重复次数,大家可以考虑下如果两个参数的元素数量不同的情况会怎么样 如:rep(c(1,2,3),c(1,2))):

> rep(c(1,3,5),3) (重复向量(1,3,5) 3次)

[1] 1 3 5 1 3 5 1 3 5

> rep(seq(1,5,2),1:3) ( 分别重复 1,3,5 的次数为 1,2,3 次 1:3 ,相当于 c(1,2,3) )

[1] 1 3 3 5 5 5

#Tips:在理解这6个对象时,小编推荐这样理解它们,如果每个元素是个点,向量就是一维的线。

f287254a076cd645dbdab9d46676b8c4.png

· 2.矩阵 ·

矩阵是一个二维的元素向量组,其实就是向量的一个升维版,内部元素也必须一致。换句话说也可以分成三种类型的矩阵。

下面是矩阵的基本使用方法:

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

nrow/ncol代表行数/列数,byrow/bycol如果参数的值为TRUE,那么就代表按照行/列填满数据(默认纵向优先),dimname代表每个行和列的表头名(不是标题),dimname必须是list的格式。例:

> mdat

+dimnames = list(c("row1", "row2"),

+c("C.1", "C.2", "C.3")))

> mdat

C.1 C.2 C.3

row1 1 2 3

row2 11 12 13

“+”代表内容未结束,接到下一行。

可以按列或者按行分别使用cbind和rbind函数将向量‘粘’在一起。

>a

>a

A B C

[1,] 1 6 15

[2,] 2 7 16

[3,] 3 8 17

[4,] 4 9 18

[5,] 5 10 19

#Tips :这个对象就像多个向量的平行拼接,而且必须是规则的矩形,恩 ~ 总的来说就是很方的二维平面。

a4df87875ca0dd0b38a35089f8c6af77.png

· 3.数组 ·

数组就像是更高维的矩阵,通常使用dim()函数来创建所需要的维度。内部元素类型需相同。同样的,数组内部元素类型必定是一样的。这里的数组可以很高的维度。

下面是数组的使用方法:

array(data = NA, dim = length(data), dimnames = NULL)

dim 参数指定每一个维度的水平数,后面的永远是高维度的水平。比如 dim=c(3,2,4) ,说明这个数组是个 4*2*3 的数组,即有 4 个 2*3 的矩阵面平行拼接。

例:

>a

(这是两个30人5列6排的班里的同学性别列表 1是男性,2是女性)

>gname=c('class1','class2')

>rname=c('r1','r2','r3','r4','r5','r6')

>cname=c('c1','c2','c3','c4','c5')

>array(a,dim=c(6,5,2),dimnames=list(rname,cname,gname))

, , class1

c1 c2 c3 c4 c5

r1 1 1 2 2 1

r2 1 2 2 1 1

r3 2 1 2 2 2

r4 1 2 2 2 2

r5 2 1 1 1 1

r6 1 1 1 2 2

, , class2

c1 c2 c3 c4 c5

r1 2 2 1 2 2

r2 2 1 1 1 1

r3 1 2 2 2 2

r4 2 2 1 1 1

r5 1 1 2 2 2

r6 1 1 1 1 1

#Tips :这个对象就像多个矩阵面的平行拼接,可以看成长方体。

1860ca9a5278c8a109b40a4572d3815e.png

· 4.因子 ·

因子是使用向量创建的R对象,类似统计学中的分类变量,它将向量与向量中元素不同值一起存储成标签,而不论是哪种类型的向量,最后都存储成字符型元素。而这种数据结构使得不同的分类类别被赋予有意义的名称成为可能。例:

> pain

> fpain

> levels(fpain)

> fpain

[1] none severe medium medium mild severe

Levels: none mild medium severe

Pain 表示 6 个病人的疼痛水平编码,我们希望把它看成一个分类变量处理,通过 factor 函数建立因子 fpain , levels 表示使用 0,1,2,3 来编码前面的向量,理论上 levels 可以省略。

4f8a26ce773c133be224555d30e025e0.png

· 5.列表 ·

列表是一个大杂烩,她可以把很多不同类型的向量复合在一起。并且,可以允许每个向量的长度不同,比较适合隶属于同一单位的多个属性的结合。

例:张三的老师制作了一个列表,包含姓名,各科成绩和是否通过:

> name

> score

> pass

> mylist

> mylist

[[1]]

[1] "zhang san" "san er"

[[2]]

[1] 98 87 79 89 91

[[3]]

[1] TRUE

另外,单独提取列表中的一个部分,可以利用列表名后的[[1/2/3]]来提取。例如:

> mylist[[2]]

[1] 98 87 79 89 91

要再进一步提取元素可以再加后标 [1/2/3/4/5]

> mylist[[2]][2]

[1] 87

#Tips :由此可见列表可以将长度不同,类型不同的向量拼接在一起,甚至可以嵌套列表。许多 R 的内置函数计算结果不仅仅是一个向量,因此以列表的形式返回结果。可以理解为二维不规则数据。

d236f7d7bc80d6dd7926d7b3a8d89ef1.png

· 6.数据框 ·

到最后一个对象了,在其他统计软件包中,数据框被称为“数据矩阵”或“数据集”,他是一系列等长度的向量和/或因子,交叉相关,很适合数据收集的类型。

例:

> d

+ gender=c('Male','Female','Female'),

+ height=c(171.5,152,165),

+ weight=c(61,56,55),

+ age=c(42,38,26)

+ )

>d

Gender height weight age

1 Male 171.5 61 42

2 Female 152.0 56 38

3 Female 165.0 55 26

数据框调用单个变量时,可以直接使用变量名如:

> d$age

[1] 42 38 26

#Tips :数据框的感觉就像每一行代表一个单位,每一列代表一项属性,因此每列内部数据类型一致,而列间数据类型可能不同。可以理解为二维规则数据。

b527f4c3de2cedc2894adde11b0a91a6.png

B. 下面我们来说一下对对象的操作:

· 1.索引 ·

如果需要向量中一个具体的元素,你可以用以下办法:

> a

> a[2]

[1] 3

方括号用来选择数据,也称为索引 (indexing) 或子集选择 (subsetting) 。如果希望修改元素值的话,可以采用左侧赋值 ( 比如: > a[2]

展示多个值,可以使用一个向量来索引:

> a[c(1,3,5)]

[1] 1 5 9

#Tips :这个 c() 是有必要的 如果是 a[1,3,5] 是指定一个三维的阵列 (a) 中的一个点,而不是 3 个点。

同时也可以采用负索引,如果想把 7 和 9 从 a 中剔除掉的结果,可以:

> a[c(-4,-5)]

[1] 1 4 5

· 2.条件选择 ·

当然有的时候我们并不知道我们想要的数据在一个向量中的位置,只需要部分满足条件的值,那么可以插入一个关系表达式来完成,选择向量中大于100的值输出:

> b=c(123,132,156,245,54,56,101)

> b[b>100]

[1] 123 132 156 245 101

比较操作符有 ( 大于 ) , ==( 等于 ) , <=( 小于等于 ) , >=( 大于等于 ) , !=( 不等于 ) 。这里需要注意双等号用来判断是否相等,避免与赋值符号 ”=” 混淆,!表示否定。还有几个结合表达式,逻辑运算符 &( 和 ) , |( 或 ) ,! ( 非 ) 。如:

> b[b>100 & b<150]

[1] 123 132 101

#Tips :其实,中间还含有一步逻辑判断结果的输出,如在上一个过程中:

> b>100 & b<150

[1] TRUE TRUE FALSE FALSE FALSE FALSE TRUE

然后是 b [ TRUE TRUE FALSE FALSE FALSE FALSE TRUE ] 来控制每一个元素是否输出 ##

· 3.数据框的索引 ·

之前我们提到数据框提取向量,使用d$age来提取d中的age变量。还有另一种方法:

> d[ ,4]

[1] 42 38 26

#Tips : 4 前面的 ”,” 最好保留,尽管在这里有和没有结果是一样的,但是输出的形式不同,而且也方便理解。只有一个数字的索引在数据框中只会提取列数据,不会提取行数据,所以 d[3, ] 中的 ”,” 省掉和不省结果是不同的。逗号前代表行,逗号后代表列。

同时,前面提到的条件选择在这里也同样适用,提取数据框d中年龄<40的单位。

> d[ d[,4]<40, ]

gender height weight age

2 Female 152 56 38

3 Female 165 55 26

这里,d[,4]<40 返回的值是一个向量,[1] FALSE TRUE TRUE,然后这个结果在索引逗号的前面代表行入选结果,第一行剔除,后两行保留。逗号后空白,代表保留所有列。 #Tips :在 R 中如果这种嵌套内容让你产生了困惑,建议分解成细小的步骤,先把内环的东西结果研究明白,循序渐进,这样就会更加容易。

有的时候,数据条目过多,只想显示开头的几行,怎么办呢?

> head(trees)

Girth Height Volume

1 8.3 70 10.3

2 8.6 65 10.3

3 8.8 63 10.2

4 10.5 72 16.4

5 10.7 81 18.8

6 10.8 83 19.7

#Tips : R 本身内置了许多数据集,可以通过 data() 来展示它们,这里的 trees 就是其中一个内置的数据集。 head() 函数默认显示前六行。同理, tail() 函数是显示数据的最后 6 行。

· 4.数据分组 ·

有的时候我们需要把一个数据集中的不同类型的单位区分开,以R自带的iris(鸢尾花)数据集为例:

> head(iris)

Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1 5.1 3.5 1.4 0.2 setosa

2 4.9 3.0 1.4 0.2 setosa

3 4.7 3.2 1.3 0.2 setosa

4 4.6 3.1 1.5 0.2 setosa

5 5.0 3.6 1.4 0.2 setosa

6 5.4 3.9 1.7 0.4 setosa

通过species变量把数据分成三个部分(species有三个取值:setosa, versicolor, virginica):

> set

> ver

> vir

或者也可以使用split()函数,他根据分组生成一系列向量(列表):

> list1

> list1

#Tips:因为结果都过大,这里不集中展示。

· 5.数据排序 ·

对向量的排序是常见工作,只需要使用sort()函数即可。

> e

> sort(e)

[1] 2 2 3 4 4 7 7 8 8

有的时候,对单一的向量的排序并不能满足我们的要求,有的时候需要根据一个变量的排序来规划其他变量的顺序。有一个特别抽象的函数order(),首先他展示的是变量的次序(这个函数有点像看病叫号):

> height

> weight

> f

> f

height weight

1 173 65

2 180 70

3 175 70

4 169 62

5 171 60

6 171 58

7 173 69

8 168 73

9 181 86

10 179 80

11 170 71

> g

> g

[1] 8 4 11 5 6 1 7 3 10 2 9

> f$weight[g]

[1] 73 62 71 60 58 65 69 70 80 70 86

当然对于多个变量的数据框也可以排序:

> f[g, ]

height weight

8 168 73

4 169 62

11 170 71

5 171 60

6 171 58

1 173 65

7 173 69

3 175 70

10 179 80

2 180 70

9 181 86

当有需要按照两个变量排序的时候,比如性别,年龄排序,那么就可以> order(sex,age)这样就可以实现先按男女排,后按年龄排序了。

到这里,我们R的对象就介绍完了。这部分的内容是一个基础的部分,可以让你理解R是怎样工作的。之后我们将继续揭开R的神秘面纱,敬请期待吧。

排版:小丸子

往期推文

R统计分析与绘图系列

浅谈一款进阶软件R的实际运用

R语言绘图之- 画个和弦图给自己

R语言之-画个弦图给自己(二)

富集分析的R包神器-ClusterProfiler使用

GEO数据挖掘系列

手把手教你GEO数据库表达谱差异基因分析(上):R版

手把手教你GEO数据库表达谱差异基因分析(下):GEO2

R语言实例操作分析GEO数据库甲基化芯片

生信神器系列

【神器分享】自从用了这个神器,大规模RNA-seq数据挖掘我也可以

一个逆天的small RNA-seq数据挖掘神器

免疫组学10KIP-这个数据库好用到爆

懒人如何分析TCGA数据之cBioportal网站

Gephi网络图极简教程

GEPIA:点点鼠标分析TCGA数据-超高自由度

零代码如何画高逼格热图?返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值