《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语言实战》第二章 数据概览

R语言实战——1.2创建数据集

《R语言实战》读书笔记-- 创建数据集

R语言之创建数据集

R语言使用random包生成随机数或者随机字符串实战:randomNumbers函数创建随机整数的数据集(包含重复项)randomSequence函数创建不含重复项的随机序列数据集创建随机字符串

R语言学习笔记第二章创建数据集 续