《R语言实战》之 创建数据集(第二章,各种数据结构)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《R语言实战》之 创建数据集(第二章,各种数据结构)相关的知识,希望对你有一定的参考价值。
数据集
2.1数据集概念
概念:通常是由数据构成的矩形数据
不同行业对数据集的行和列叫法不同
行业人 | 行 | 列 |
统计学家 | 观测(observation) | 变量(variable) |
数据库分析师 | 记录(record) | 字段(field) |
数据挖掘和机器学习研究中 | 示例(example) | 属性(attribute) |
可处理的数据类型(模式):数值型、字符型、逻辑型、复数型、原生型(字节)
存储数据的结构:标量、向量、数据、数据框和列表
实例的标识符:rownames(行名);实例的类别型:因子(factors)
2.2数据结构
这节讲了几个数据结构,向量、矩阵、数组、数据框,前三种分别是一维、二维、大于二维的,它们共同点是一个数据结构中,仅能用一种数据的模式,而数据框则可以多种模式。
一些定义
对象:可复制给变量的任何事物,包括常量、数据结构、函数、图形
模式:描述对象如何存储和某各类
数据框:存储数据的一种结构(列表示变量,行表示观测),一个数据框可存储不同类型的变量(如数值型、字符型)
2.2.1 向量(一维数据,数值型、字符型、逻辑型)
a<- c(1,2,3) #数值型 b<-c("one","two","three")#字符型 c<-c(TRUE,TURE,FALSE) #逻辑型
注意:1.字符型的向量,元素要加“ ”或者‘ ‘,数值型和逻辑型不需要。
2.同一向量,只能用一种模式的数据;
3.标量是只含一个元素的向量
#标量是 只含一个元素的向量 f<- 1 g<-"US" h<-TRUE
方括号的作用:元素的位置数值,具体如何访问向量中的元素,看下面代码
> a<-c("k","j","h","a","c","m") #生成一个向量 > a[3] #向量a的第三个元素 [1] "h" > a[c(1,3,5)] #向量a的第1个、第3个、第5个元素 [1] "k" "h" "c" > a[2:6] #生成一个数值序列,向量a的从第2个到第6个的元素。等价于a( [1] "j" "h" "a" "c" "m" #两种方式生成的向量a一样 > a<-c(2:6) > a [1] 2 3 4 5 6 > a<-c(2,3,4,5,6) > a [1] 2 3 4 5 6
2.2.2 矩阵(二维数值,字符型、数值型、逻辑型)
注意:矩阵中仅能包含一种数据类型
函数matrix()
作用:创建矩阵
格式:myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(char_vector_rownames, char_vector_colnames))
其中,vector--矩阵的元素;nrow、ncol--分别制定行和列的维数;dimnames--可选的、以字符型向量表示的行名和列名;byrow--矩阵行行填充(byrow = TRUE)或者按列填充(byrow =FALSE),默认是按列。
matrix用法实例
eg1. 创建一个元素为1到20,大小5*4的矩阵,默认按列排列。
> y<-matrix(1:20,nrow=5,ncol=4) > y [,1] [,2] [,3] [,4] [1,] 1 6 11 16 [2,] 2 7 12 17 [3,] 3 8 13 18 [4,] 4 9 14 19 [5,] 5 10 15 20
eg2.
> cells <- c(1,26,24,68) > rnames<-c("R1","R2") > cnames<-c("C1","C2") #按列排列(也是默认方式) > mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 24 R2 26 68 #按行排列 > mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames)) > mymatrix C1 C2 R1 1 26 R2 24 68
选择矩阵中的元素:
X[i,]:矩阵中的第i行; X[,j]:矩阵中的第j列; X[i,j]:第i行即j列元素
选择多行或多列,下标i和j可为数值型向量
例子:
> x<-matrix(1:10,nrow=2) > x [,1] [,2] [,3] [,4] [,5] [1,] 1 3 5 7 9 [2,] 2 4 6 8 10 > x[2,] [1] 2 4 6 8 10 > x[,2] [1] 3 4 > x[1,4] #第1行的第4各个元素 [1] 7 > x[1,c(4,5)] #第1行的,第4个元素和第5个元素 [1] 7 9
2.2.3 数组(维度可以大于2)
注意:数组中的数据只能拥有一种模式
创建方式:array( )
myaaray <- array(vector, dimensions, dimnames)
其中,vector -- 数组的中数据;dimensions -- 数值型向量,给出各维度的最大值;dimnames -- 可选的、各维度名称标签的列表.
eg.创建三维(2*3*4)数值型数组
> dim1<-c("A1","A2") > dim2<-c("B1","B2") > dim2<-c("B1","B2","B3") > dim3<-c("C1","C2","C3","C4") > z<-array(1:24,c(2,3,4),list(dim1,dim2,dim3)) > z , , 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 > z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3)) > z , , 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
选取元素的方式与居住类似,例如:z[1,2,3]为15.
2.2.4 数据框(可包含不同模式(数值型、字符型等)的数据)
注意:可将多种模式的数据放入一个矩阵,但每列的数据模式必须唯一,不同列模式可以不同
创建函数 data.frame( )
mydata <- data.frame(col1, col2, col3)
其中,列向量col1,col2,col3可为任何类型(如字符型、数值型或逻辑型)
> patientID<-c(1,2,3,4) > age<-c(25,34,28,52) > diabetes<-c("Type1","Type2","Type1","Type2") > 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 Type2 Poor
选取数据框中的元素:1.用下标记号。2.直接指定列明。3.$:选取给定数据框的某个特定变量
> patientdata[1:2] patientID age 1 1 25 2 2 34 3 3 28 4 4 52 > patientdata[c(1:3)] patientID age diabetes 1 1 25 Type1 2 2 34 Type2 3 3 28 Type1 4 4 52 Type2 > patientdata[c("diabetes","status")] diabetes status 1 Type1 Poor 2 Type2 Improved 3 Type1 Excellent 4 Type2 Poor > patientdata$age [1] 25 34 28 52
用$生成diabetes和status的列联表
Excellent Improved Poor Type1 1 0 1 Type2 0 1 1
比数据框$变量名调用变量更简单的方法是用attach()和detach(),和with
1.attach( )、detach()和with()
attach()可将数据框添加到R的搜索路径,有了它,调用数据框里的变量时,就不需要再告诉R现在调用的变量在什么数据框了。
detach()是将数据框从搜索路径中移除。
attach()和detach()像是一对兄弟,但事实上,detach不对数据本身作用,可以省略。
summary(mtcars$disp) plot(mtcars$mpg,mtcars$disp) plot(mtcars$mpg,mtcars$wt)
等价于
attach(mtcars) summary(mpg) plot(mpg,disp) plot(mpg,wt) detach(mtcars)
局限:当名称相同的对象不止一个,用attach()就会出问题。原始对象将取得优先权,后来的对象将被屏蔽(masked)。
with()如何得到与上面代码一样的结果呢,看如下代码
with(mtcars,{ print(summary(mpg)) plot(mpg,disp) plot(mpg,wt)})
with(mtcars,{print(summary(mpg))
plot(mpg,disp)
plot(mpg,wt)})
注意花括号里要没有逗号,要换行隔开,我自己运行,没换行不能实现。花括号的语句都是针对数据框mtcars,如果花括号里只有一条语句,花括号可以省略
局限:赋值仅在此函数的括号内剩下。
改进:用特殊复制符<<-代替<-,则可将对象保存到with外的全局环境中。
> with(mtcars,{nokeepstates<-summary(mpg) + keepstates<<-summary(mpg)}) > nookeepstates Error: object ‘nookeepstates‘ not found > keepstates Min. 1st Qu. Median Mean 3rd Qu. Max. 10.40 15.43 19.20 20.09 22.80 33.90
结果不言而喻,因为keepstates保存到with()之外的全局环境中,而nookeepstates没有,所以当离开了with(),只有keepstates存在。
2.实力标识符
通过row.names=某个变量指定实例标识符,我的理解,是我们在学校的学号,工作中的工号那样的作用
patientdata<-data.frame(patientID,age,diabetes,status,row.names=patientID)将patientID指定为R中标记各类打印输出和图形中实例名称所用变量(这是书本的原话),我的理解是patientID是数据框中唯一可以标识身份的变量。每个实例或者说是观测来说是独一无二的。
2.2.5 因子(决定数据的分析方式和视觉呈现方式)
变量 | ||
名义型变量 | 没顺序的类别变量 | 因子 |
有序型变量 | 有顺序关系,没数量关系 | 因子 |
连续型变量 | 同时有顺序和变量 | ---- |
函数:factor()
作用:以整数向量形式存储类别值,从1开始,将一个由字符串(原始值)组成的内部向量映射到这些整数上。
将原始值转化成数值型变量
- 名义型变量--->以整数向量形式存储
disabetes <- c("Type1", "Type2" ,"Typye1", "Type1")
> diabetes<-factor(diabetes) #将向量diabetes存储为(1,2,1,1) > diabetes #关联关系为1=Type1,2=Type2 (赋值根据字母顺序定) [1] Type1 Type2 Type1 Type2 Levels: Type1 Type2 > str(diabetes) Factor w/ 2 levels "Type1","Type2": 1 2 1 2
注意:针对diabetes的任何分析都将作为名义型向量对的,并自动选择适合这一测量尺度的统计方法。
- 有序型变量---->以整数向量形式存储(在factor()函数中药加入参数ordered=TRUE)
> status<-c("Poor","Improved","Excellent","Poor") > status [1] "Poor" "Improved" "Excellent" "Poor" > status<-factor(status,ordered=TRUE,levels = c("Poor","Improved","Excellent")) #因子的水平默认依据字母顺序而定,levels覆盖默认排序 > str(status) Ord.factor w/ 3 levels "Poor"<"Improved"<..: 1 2 3 1
注意:针对此变量进行的任何分析都会作为有序型变量对待,并自动选择合适的统计方法
- 数值型变量(需要用到参数levels和labels)
假设男性编码成1,女性编码成2
> sex<-c(1,1,2) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 1 2
注意:标签的顺序labels = c( "Male", "Female")和水平一致levels = c( 1, 2 )
标签"Male"和"Female"将代替1和2在结果种输出,而不是1或者2的性别变量将被当作缺失值。> sex<-c(1,2,3) > sex<-factor(sex,levels = c(1,2),labels = c("Male","Female")) > str(sex) Factor w/ 2 levels "Male","Female": 1 2 NA
下面看普通因子和有序因子如何影响数据分析
#以向量形式输入
patientID <- c(1, 2, 3, 4) age <- c(25, 34, 28, 52) diabetes <- c("Type1", "Type2", "Type1", "Type1") status <- c("Poor", "Improved", "Excellent", "Poor") #将diabetes指定为普通因子
diabetes <- factor(diabetes)
#将status指定为有序型因子 status <- factor(status, order=TRUE)
#将数据合并为数据框 patientdata <- data.frame(patientID, age, diabetes, status)
#str(object)显示对象的结果,提供R中某个对象(此例为数据框)的信息 str(patientdata)
$summary() 区别对待各个变量,显示对象的统计概要 summary(patientdata)
运行后
> str(patientdata) ‘data.frame‘: 4 obs. of 4 variables: $ patientID: num 1 2 3 4 $ age : num 25 34 28 52 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 2 $ status : Factor w/ 3 levels "Excellent","Improved",..: 3 2 1 3 > summary(patientdata) patientID age diabetes status Min. :1.00 Min. :25.00 Type1:2 Excellent:1 1st Qu.:1.75 1st Qu.:27.25 Type2:2 Improved :1 Median :2.50 Median :31.00 Poor :2 Mean :2.50 Mean :34.75 3rd Qu.:3.25 3rd Qu.:38.50 Max. :4.00 Max. :52.00
运行str()后,清楚地显示diabetes是一个因子,status是有序型因子以及数据框在内部如何编码
运行summary()后,各个变量区别被对待,显示连续型变量age的最小值、最大值、均值、四分位数。而diabetes和status(各水平)这两个因子则显示频数值。
2.2.6 列表
定义:对象(或成分)的有集合。允许整合若干(可能无关)对象到单个对象名下。
因此,某个对象可能是若干向量、矩阵、数据框甚至其他列表的组合。
创建列表的函数: list()
mylist <- list( object1, object2,...)
列表中的对象命名: mylist<- list(name1 = object1,name2 = object2)
g<-"My First List" #字符串 h<-c(25,26,18,39)#数值型向量 j<-matrix(1:10,nrow=5)#5*2的矩阵 k<-c("one","two","three")#字符型向量 mylist<-list(title=g,h,j,k) #创建列表,其中,第一个对象命名为title
> mylist $title [1] "My First List" [[2]] [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"
访问列表中的元素 1.可通过双括号致命带包某个成分的数字。2.通过名称
> mylist[[1]] [1] "My First List" > mylist[["title"]] [1] "My First List" > mylist$title #要命名了才可以 [1] "My First List"
以上是基本的各种数据结构。
以上是关于《R语言实战》之 创建数据集(第二章,各种数据结构)的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)randomSequence函数创建不含重复项的随机序列数据集创建随机字符串