R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。下图是一张R语言数据结构图。
向量
定义:
- 用于存储数值型、字符型或逻辑型数据的一维数组。向量中的元素类型必须全为数值型或者字符型或者逻辑型。向量中的单个元素称为标量,属于特殊的向量。
向量是R语言中最基础,也是最重要的数据类型。
向量类型
- 数值型向量:向量中的元素全为数字
- 字符型向量:向量中的元素既可以全为字符,也可以包含数字,但是这里的数字是字符串,并不是数值。
- 逻辑型向量:向量中的元素只有两种
TURE
或者FALSE
向量的创建
数值型向量的创建
c(1,2,3,4,5,6) ## [1] 1 2 3 4 5 6 1:6 ## [1] 1 2 3 4 5 6 rep(1,3) # 重复1三次 ## [1] 1 1 1 rep(1:3,3) # 重复(1,2,3)三次 ## [1] 1 2 3 1 2 3 1 2 3 rep(1:3,each = 3) # 重复1,2,3各三次 ## [1] 1 1 1 2 2 2 3 3 3 c(rep(1:3,3),rep(1:3,each = 3)) # 合并向量 ## [1] 1 2 3 1 2 3 1 2 3 1 1 1 2 2 2 3 3 3
字符型向量的创建
b = c("one", "two", "three") b ## [1] "one" "two" "three"
逻辑型向量的创建
c = c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE) c ## [1] TRUE TRUE TRUE FALSE TRUE FALSE
向量中元素的访问
a = c("k", "j", "h", "a", "c", "m") #提取向量a中第二个元素 a[2] ## [1] "j" #提取向量a中前3个元素 a[c(1,2,3)] ## [1] "k" "j" "h" #提取向量a中前3个元素 a[1:3] ## [1] "k" "j" "h"
矩阵
定义:
- 矩阵是二维数组,矩阵中的元素都拥有相同的类型。大多数情况下,我们使用的矩阵就是数值型矩阵,矩阵中的元素全为数值,矩阵也可以理解为折叠起来的数值型向量。
矩阵的创建
rnames = c('r1','r2','r3','r4','r5','r6') cnames = c('c1','c2','c3','c4','c5') myymatrix <- matrix(1:30, nrow=6, ncol=5, byrow=F, # 默认按列填充 dimnames=list(rnames, cnames)) # 行名和列名 myymatrix ## c1 c2 c3 c4 c5 ## r1 1 7 13 19 25 ## r2 2 8 14 20 26 ## r3 3 9 15 21 27 ## r4 4 10 16 22 28 ## r5 5 11 17 23 29 ## r6 6 12 18 24 30
矩阵下标的使用
提取矩阵中第2行
a1 = myymatrix[2,] a1 ## c1 c2 c3 c4 c5 ## 2 8 14 20 26
提取矩阵中的1,3,5行
a2 = myymatrix[c(1,3,5),] a2 ## c1 c2 c3 c4 c5 ## r1 1 7 13 19 25 ## r3 3 9 15 21 27 ## r5 5 11 17 23 29
提取矩阵中第2列
b1 = myymatrix[,2] b1 ## r1 r2 r3 r4 r5 r6 ## 7 8 9 10 11 12
提取矩阵中的2,4,5列
b2 = myymatrix[,c(2,4,5)] b2 ## c2 c4 c5 ## r1 7 19 25 ## r2 8 20 26 ## r3 9 21 27 ## r4 10 22 28 ## r5 11 23 29 ## r6 12 24 30
提取任意子矩阵
data = myymatrix[1:4,2:4] data ## c2 c3 c4 ## r1 7 13 19 ## r2 8 14 20 ## r3 9 15 21 ## r4 10 16 22
数组
定义:
- 数组和矩阵基本上属于一种数据类型,矩阵是特殊的数组,而数组一般指三维及以上。数组在R语言中用的很少,所以这里只写出数组的创建方法。
数组的创建
dim1 = c('A1','A2') dim2 = c('B1','B2','B3') dim3 = c('C1','C2','C3','C4') data = array(1:24, dim = c(2,3,4), dimnames = list(dim1,dim2,dim3)) #相当于创建4个2行3列的矩阵 data ## , , 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
数据框
定义:
- 数据框和矩阵结构相似,由行列组成,数据框中每一列为一个成分,数据框中的成分类型分为两种:一种是向量,另外一种是因子。
数据框是R中最常见的数据结构之一,一般数据处理都是基于数据框。
数据框的创建
patientID <- c(1, 2, 3, 4) age <- c(25, 34, 28, 52) diabetes <- c("Type1", "Type2", "Type1", "Type1") status <- c("Poor", "Improved", "Excellent", "Poor") patientdata <- data.frame(patientID, age, diabetes, status) 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
选取数据框的元素
数据框中常见的元素选择方法有三种。
方法一:和矩阵下标的使用一样,不再过多介绍。
方法二:
变量名筛选
patientdata[,c('age','diabetes')] ## age diabetes ## 1 25 Type1 ## 2 34 Type2 ## 3 28 Type1 ## 4 52 Type1
$
符号筛选patientdata$age ## [1] 25 34 28 52
方法三:
使用
attach()
函数和deteach()
函数attach(mtcars) plot(mpg, disp)
detach(mtcars)
使用
with()
函数,with()
函数使用有一个缺点,with()
函数里面赋值给对象需要用<<-
,不能用<-
或者=
,只有这样才可以将对象保存到全局环境中。with(mtcars, { plot(mpg, disp) })
因子
在我们处理的数据中,通常将数据框中的列(成分)也称为变量
或者属性,而行称为观测或者示例,在R中把数据框的列叫做变量更普遍。变量是统计学中的名词,在数据框中变量既可以是向量,也可以是因子
。变量通常有三种类型,名义型(类别型)、有序型和连续型变量。
变量类型:
- 名义型变量:性别有男女之分,体型有胖瘦之别,这些都是名义型(类别型)变量
- 有序型变量:癌症的分期有早期、中期和晚期,变量中的值有顺序之分,称为有序变量
- 连续型变量:人的体重就是连续型变量,表现为一定范围内的任意值,与数值型向量等价。
名义型变量和有序性变量在R中统称为因子
因子的创建
factor()
函数创建名义型因子
sex = c("male", "female", "male", "female") sex = factor(sex) sex ## [1] male female male female ## Levels: female male class(sex) ## [1] "ordered" "factor"
factor()
函数创建有序型因子
status = c("early", "middle", "late", "late") status = factor(status, order=TRUE, levels=c("early", "middle", "late")) status ## [1] early middle late late ## Levels: early < middle < late class(status) ## [1] "ordered" "factor"
有时候需要将因子名称用数字表示,这时候就需要对因子重命名
type = c("Type1","Type1","Type2","Type1","Type2") type = factor(type,levels = c("Type1","Type2"),labels = c(1,2))
列表
定义:
- 列表是R语言中高级数据类型,列表是一些
对象
的有序集合,对象为任何一种数据类型。列表中的对象可以是向量、矩阵、数组、数据框和因子,甚至列表中也可以包含列表。
列表的创建
一般使用list()
函数来创建列表
g = "My First List" h = c(25, 26, 18, 39) j = matrix(1:10, nrow=5) k = c("one", "two", "three") mylist = list(title=g, ages=h, j, k) mylist ## $title ## [1] "My First List" ## ## $ages ## [1] 25 26 18 39 ## ## [[3]] ## [,1] [,2] ## [1,] 1 6 ## [2,] 2 7 ## [3,] 3 8 ## [4,] 4 9 ## [5,] 5 10 ## ## [[4]] ## [1] "one" "two" "three"
列表中对象的提取
使用mylist$age
和mylist[[2]]
都表示提取向量h
mylist$age;mylist$age == mylist[[2]] ## [1] 25 26 18 39 ## [1] TRUE TRUE TRUE TRUE
处理对象的通用函数
函数 | 作用 |
---|---|
length(object) |
显示对象中元素/成分的数量 |
str(object) |
显示某个对象的结构 |
class(object) |
显示某个对象的类型 |
head(object) |
列出某个对象的开始部分 |
tail(object) |
列出某个对象的最后部分 |
ls() |
显示当前的对象列表 |
rm(object, object, ...) |
删除一个或更多个对象。语句rm(list = ls()) 将删除当前工作环境中的几乎所有对象 |
特殊数据
格式 | 含义 | 查看 |
---|---|---|
NA |
缺失值 | is.na() |
NaN |
非数字,如0/0 |
is.nan() |
Inf |
无穷数,如1/0 |
is.infinite() |
NULL |
空数据 | is.null() |
参考资料
R语言实战(二)