生信R语言:总结知识点

R 语言主要有向量、矩阵、数组、因子、数据框、列表等数据结构。

在这里插入图片描述

向量 vector
用于储存数值、字符、逻辑值的一维数据结构。
用于构建向量的函数是 R 语言中最简单的函数之一,形式为 :c()
1.单个向量中的数据必须具有相同的类型 (数值型、字符型、逻辑型)
若传入了不同类型的数据,则系统会自动进行类型转换:
(转换的顺序是 logical<integer<numeric<complex<character<list),即逻辑值被修改为整型数据
2.通过向量中元素的位置 (即索引) 我们可以访问向量中的某个元素
3.还可以用一个向量包含多个位置索引传入中括号内,已达到一次访问多个元素的目的,如:a [ b(1,2,3) ]
4.也可使用 “切片”方式来进行多个元素的访问,这同Python一致,用冒号分隔位置索引起始与结束位置。2:4就是23元素。
5.也可同Python中的 “反向选择”,位置索引前加上’−’ 实现,其实就是反选。如:d[-(2:4)]
6.可使用数学表达式来达成某个条件匹配数据 , 如:c [c > 6]

矩阵 matrix
二维的数据结构,看作二维的向量也可。
R 中用于生成矩阵的函数是:matrix()函数,
将其它数据结构的数据转换为矩阵:通过 as.matrix() 函数
与向量类似,同一矩阵中无法同时包含不同类型的数据。

matrix0 <- matrix(vector,       #matrix() 函数以一个向量为输入数据,并将该向量转换为矩阵类型;
				  nrow=number_of_rows,    #参数nrow定义了矩阵的行数
				  ncol=number_of_columns, #参数ncol定义了矩阵的列数
				  byrow=TRUE,  #先按照行来依次数据,若为false则先列
				  dimnames=list(char_vactor_for_row.names,#参数dimnames定义了矩阵的行、列的名称
           		  char_vactor_for_col.names))

举例

v <- c(1:9)
matrix2 <- matrix(v, nrow=3, ncol=3, byrow=TRUE)
matrix2
#生成如下
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
matrix3 <- matrix(v, nrow=3, ncol=3, byrow=FALSE,
dimnames=list(c("row1","row2","row3"),
c("col1","col2","col3")))
matrix3
##     col1 col2 col3
## row1 1    4    7
## row2 2    5    8
## row3 3    6    9

访问和操作矩阵中的数据和向量是类似,我使用位置索引和方括号来选择矩阵中的行、列或元素。
即:M[i ,j] 指矩阵 M 的第 i 行第 j 个元素
如果省略 j,则 M[i,] 指的是矩阵 M 中第 i 行,同理 M[,j] 指的是矩阵 M 中第 j 列;
如 M[i],区别于上述逗号存在,系统返回的是矩阵的(也是构建矩阵所用向量) 第 i 个元素;

数组 array
数组 array 在 R 语言中被用于表示和储存高于两个维度数据,例如三维数据。通过 array() 函数创建:

array0 <- array(vector, 
				dimensions=c(size_of_dim1,size_of_dim2,size_of_dim3),#定义维度大小,同矩阵
				dimnames=list(char_vactor_for_dim1.names,
							  char_vactor_for_dim2.names,	#定义数组各个维度名称
							  char_vactor_for_dim3.names))

与矩阵类似,array() 函数以一个向量为输入数据,将该向量转换为数组类型;
参数dimensions定义了数组在各个维度上的大小,它的功能与matrix()函数中的nrow和ncol参数类似;
同样参数dimnames定义了数组各个维度的名称。

v <- c(1:24)
	dim1 <- c("A1","A2")
	dim2 <- c("B1","B2","B3")	#相当于三个向量
	dim3 <- c("C1","C2","C3","C4")
	array1 <- array(v, 
					dim=c(2,3,4),	#定义维度大小
					dimnames=list(dim1,dim2,dim3))
array1
## , , C1
##
   ## B1 B2 B3
## A1 1  3  5
## A2 2  4  6
##
## , , C2
##
   ## B1 B2 B3
## A1 7  9  11
## A2 8  10  12
##
## , , C3
##
	## B1 B2 B3
## A1 13 15 17
## A2 14 16 18
##
## , , C4
##
	## B1 B2 B3
## A1 19 21 23
## A2 20 22 24

与向量、矩阵一样,数组中的数据也只能是一种类型。
矩阵中的数据访问方法是从向量的一维位置索引扩展到了二维,向量则二维至高维。
例中 array1[2,2,2] 等于 10,也就是在位置点 (A2、B2、C2) 上的数据值。

因子 factor
因子 是 R 语言中一类特殊的数据结构。其他语言没有。
标准形式为:

factor0 <- factor(vector,		#factor() 函数以一个向量作为输入数据
				levels=unique_set_of_vector,#参数levels指定因子的 “水平”,当不指定levels时 (即取默认值),levels将等于
											#unique(vector),函数 unique() 将返回一个由输入向量 vector 中不重复
											#的元素组成的集合 (向量),由用户以 vector 的形式指定的levels时,长度不限
				labels=Str_or_Character_vector,
						#参数labels可以等于一个字符串(打标签),或等于一个长度和 unique(vector)	一致的向量
				exclude=Character_vector,
						#参数exclude指定了因子中哪些 “水平” 被屏蔽掉,而被屏蔽掉的元素由 NA 代替
				ordered=logical)
						#参数ordered指定了因子是否被视作有序的,当ordered=TRUE时 factor() 函数与 ordered() 函数等效

同样的,factor() 函数以一个向量作为输入数据;
参数labels可以等于一个字符串,用于给不同的水平打标签,或者等于一个长度和 unique(vector) 一致的向量;
参数exclude指定了因子中哪些 “水平” 被屏蔽掉,而被屏蔽掉的元素由NA 代替;
参数ordered指定了因子是否被视作有序的,当ordered=TRUE时 factor() 函数与 ordered() 函数等效。
较难理解,举出举例:

vf <- c("A","B","C","A","A","B","C","B","D")
unique(vf)
## [1] "A" "B" "C" "D"

factor1 <- factor(vf,levels=c("A","B","C","D","E"))
factor1
## [1] A B C A A B C B D
## Levels: A B C D E
#上例中参数levels被指定了一个长度长于 unique(vf) 的向量,

#而如果指定一个长度小于 unique(vf) 的向量时,其效果与参数exclude的效果类似:同factor3
factor2 <- factor(vf,levels=c("A","B","C"))
factor2
## [1] A B C A A B C B <NA>
## Levels: A B C

#同上factor2
factor3 <- factor(vf,levels=c("A","B","C","D"),exclude=c("D")) 
factor3
## [1] A B C A A B C B <NA>
## Levels: A B C

参数labels的设定稍显复杂,当我们指定一个字符串时,因子中的数据将进行相应的替换:

factor4 <- factor(vf,
					levels=c("A","B","C","D"),
					labels="L")
factor4
## [1] L1 L2 L3 L1 L1 L2 L3 L2 L4
## Levels: L1 L2 L3 L4

于 R 语言中单字符串可视作一个长度为 1 的向量,因此labels=“L”
与labels=c(“L”) 等效。但如果指定的向量长度大于 1 时,必须让其长度等
于 unique(vf),否则系统会报错:如下

#错误
factor5 <- factor(vf,levels=c("A","B","C","D"),
labels=c("L","M"))
## Error in factor(vf, levels = c("A", "B", "C", "D"),报错提醒labels = c("L", "M")) : object 'vf' not found
#正确
factor5 <- factor(vf,levels=c("A","B","C","D"),
labels=c("L","M","N","O"))
factor5
## [1] L M N L L M N M O
## Levels: L M N O

排序order也可实现
当ordered=TRUE 时:

factor7 <- factor(vf,ordered=TRUE)
factor7
## [1] A B C A A B C B D
## Levels: A < B < C < D 

因子 factor 在 R 语言中是非常重要的一个数据类型,它决定了数据分析的方式已经分析结果的可视化。
前文涉及的向量、矩阵、数组,上述均不能同时包含不同类型的数据,
我们以一个向量向 factor() 函数传入数据时,各元素的数据类型总归为一致。因此因子也不会包含不同类型的数据。
另外注意,实际上不论传入的向量中的元素为何种类型,
对于因子factor() 函数在执行过程中,各元素会被 factor() 函数转化为匹配元素位置的索引 (数值型),因此因子中的元素数据类型为 integer,模式为 numeric。如下

vf2 <- c(1,2,1,"A")
factor8 <- factor(vf2)
	factor8
	## [1] 1 2 1 A
	## Levels: 1 2 A
	
	factor8[4]
	## [1] A
	## Levels: 1 2 A
	
	typeof(factor8[4])
	## [1] "integer"

数据框 data.frame
向量、矩阵、数组、因子都不能或不会包含同类型的元素数据,
当我们碰到一组数据中即包含有数值型数据、也包含字符型数据、分类变量、甚至包含逻辑型数据的情况。
R 为我们提供的第四种数据结构:数据框data.frame。
数据框的维度和矩阵是一样的,只是它较矩阵更为一般化,
形象的讲,数据框就像我们在其它数据处理软件,如 Excel,中看到的表格或数据集。
因此,数据框将是我们在 R 语言中使用最频繁的数据结构。数据框有函数data.frame()构建,标准形式如下:

df0 <- data.frame(col1, col2, col3, ...#参数col1,col2,col3指定了数据框中第 1、2、3 列的数据 (变量)
					row.names=NULL,  #参数row.names为每行数据指定名称,每列数据名称由参数col1的名称指定的
					check.rows=FALSE, #参数check.rows规定了是否检查各行数据的长度是否一致和行的名称是否有重复
					check.names=TRUE, #参数check.names规定了是否检查各变量名称是否有重复;
	stringsAsFactors=default.stringsAsFactors())#参数stringsAsFactors设置是否将字符型数据转换为因子来处理,默认值为 TRUE

举例说明:

L3 <- LETTERS[1:3]
fac <- sample(L3, 5, replace = TRUE)
x <- 1	#x这一列全是1
y <- 1:5#y这一列是1到5****************************************************没太懂与模板不符
df1 <- data.frame(x, y, fac)#x,y,fac为列的名称
df1
  ## x y fac
## 1 1 1 B
## 2 1 2 A
## 3 1 3 A
## 4 1 4 A
## 5 1 5 A

如果参数stringsAsFactors设置为 FALSE,虽然在表面上生成的数据框
没有显著区别,但上例中 fac 的类型将由 factor 变为 character,我们将无
法享受因子带来的好处。这一点隐藏在背后的数据类型上的差别,往往会给
我们的数据分析带来麻烦,是需要我们特别注意的。
关于数据框中的数据访问,我们可以使用访问矩阵中数据的方式:

df1[1,]
  ## x y fac
## 1 1 1 B

df1[,1]
## [1] 1 1 1 1 1

df2[1,] 访问数据框中的第一行,df2[,1] 访问数据框中的第一列。此时你
可能会觉得访问列的方式并不直观,我们期望仍然竖列的方式来显示,可以
以下方式访问列:

df1[1]
## x
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1

df1[1:2]
  ## x y
## 1 1 1
## 2 1 2
## 3 1 3
## 4 1 4
## 5 1 5

df1[c(1,3)]
  ## x fac
## 1 1 B
## 2 1 A
## 3 1 A
## 4 1 A
## 5 1 A

这里我们再介绍一种数据访问的方式:$
当我们可以为变量命名时,就可以用美元符号加变量名称的方式来访问变量。

df1$x
## [1] 1 1 1 1 1

df1$fac
## [1] B A A A A
## Levels: A B

请注意这里输出格式的差别。如我们想用名称来访问,同时又能以竖列的方式显示,
可以直接在列名上添加单引号进行竖排显示,不叫则横排显示:

df1['fac']
  ## fac
## 1 B
## 2 A
## 3 A
## 4 A
## 5 A

列表 list
列表 list 是 R 语言中最复杂的数据结构,它是一个有序的对象集合。
之所以称之为最复杂的数据结构,
是因为列表允许我们整合若干结构不同的对象到一个对象中,
具体的说,列表中可以存放向量、矩阵、数组、因子、数据框这些我们之前遇到过的数据结构,甚至是可以将列表放于列表之中。构建列表我们用list()函数:
列表巨能装啊这是!自己吃自己

list0 <- list(obj1, obj2, obj3, ...
				#参数obj1,obj2,obj3指定了列表中第 1、2、3 个数据对象
				all.names=FALSE,
#参数all.names规定了是否拷贝所有变量名称或者忽略名称中以点号开始的变量 (默认值)
				sorted=FALSE)
#sorted规定了是否将各对象按名称排序,排序将花费计算资源,但当进行比较时则会高效

具体实例:

list1 <- list(1,2,3)
list1
  ## [[1]]
## [1] 1
##
  ## [[2]]
## [1] 2
##
  ## [[3]]
## [1] 3
A <- c(1,2,3,4)	#先设置A,B,C的形式状态
B <- "hello world"
C <- matrix(1:9,nrow=3) #矩阵matrix一到九,三行排
list2 <- list(A,B,C) #列表装三种不同形式东西,以列表形式归为list2

list2
## [[1]]
##   [1] 1 2 3 4
##
## [[2]]
##   [1] "hello world"
##
## [[3]]
##    [,1] [,2] [,3]
## [1,] 1 	4 	7
## [2,] 2 	5 	8
## [3,] 3 	6 	9

给每一个数据对象命名则更有助于组织和观察数据:

list3 <- list(object1=A, object2=B, object3=C)

list3
## $object1
## [1] 1 2 3 4
##
## $object2
## [1] "hello world" 略c

仔细观察我们会发现,当数据对象未命名时,系统会自动为对象以双中
括号包括对象顺序的方式命名,且自定义名称并不会打乱对象的排序方式,
如 list4。但中括号包裹排序位置的方式,将返回数据对象,而双括号包裹排
序位置的方式,将返回数据对象中的数据:

list4[1]
## $object1
## [1] 1 2 3 4
typeof(list4[1])
## [1] "list"
list4[[1]]
## [1] 1 2 3 4
typeof(list4[[1]])
## [1] "double

因此 list4[1] 的数据类型为 list,而 list4[[1]] 的数据类型为 double。
双括号出了包括排序位置外,还可以包裹数据对象的名称:

list4['object1']
## $object1
## [1] 1 2 3 4
list4[['object1']]
## [1] 1 2 3 4

此外美元符号加数据对象名的方式也是列表数据方位的常用方式

其它数据结构
实践中仍有一些特殊的数据,仅用上述数据结构表达起来尚显困难,例如表达数学关系的公式,表达时间概念的时期和时间,以及表达具有时序关系的数据等,为方便表达这些数据,R 语言也为我们提供了一些特殊的数据结构。

    • 公式 Formula

数学语言是表达变量之间关系的最好方式。例如
1.描述两个变量之间的线性关系
2.我们想拟合一个回归模型。
为表达上述数据,R 提供了公式 formula 类,并由 formula() 函数构建:

formula1 <- formula(y ~ x1 + x2 + x3)
class(formula1)
## [1] "formula"

typeof(formula1)
## [1] "language"

组成公式的的成分包含:
(表示 变量名称 的符号)和(表达 变量间关系 的符号)
名称符:只要符合 R 语言关于变量命名的法则的字符都可表示变量。
关系符:由于变量间关系的复杂性,R 提供如下表示关系的符号:

  • 波浪号 (∼):用于连接公式中响应变量和自变量,等同于数学公式中的等号;
  • 加号 (+):表示自变量间的线性关系;
  • 星号(∗):表示自变量间的交互作用;
  • 竖线 (|):用于指定条件变量;
  • 尖角符号 (ˆ ):表示幂运算。

此外公式中还可以使用函数,
如函数 I():按照算术意义解释放在 I函数中的表达式;
其它一些数学函数如 log()、sin()、sqrt(),这些函数可以将自变量进行相应的数学变换后进入公式发挥作用。
公式不仅在统计建模、数据预测等方面能发挥特殊的中,在数据可视化方面也可发挥重要作用,R 作图中详加解释。

    • 日期 Date、时间 Time

R 语言用于表示时间的数据结构包括 Data 类、POSIXct 类和 POSIXlt类。
Data 类只能表示日期对象,不能反映时间信息:

birthday <- as.Date("2/23/2012",format="%m/%d/%Y")
birthday
## [1] "2012-02-23"

Sys.Date() - birthday
## Time difference of 3163 days

POSIXct 类是以 1970 年 1 月 1 号开始的以秒进行存储,
如果是负数,则是 1970 年以前;正数则是 1970 年以后。

POSIXlt 类是以列表的形式存储:年、月、日、时、分、秒;

R 之所以用专门的数据结构来表示,是因为日期和时间类数据可以方面的进行加减运算,而字符串则比较困难。

    • 时间序列 Time Series

许多重要的问题都需要研究变量随时间的变化规律,我们可以在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。
R 中用来表示该类型数据的数据结构为:
时间序列对象,用 ts()函数构建。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值