《R语言入门与实践》学习笔记三

来源:互联网 发布:apache spark 编辑:程序博客网 时间:2024/04/27 18:10

第三课任务:

完成项目玩扑克牌前1/2,并通过项目学会以下技能:

   1)存储新的数据类型,比如字符串和逻辑值。

   2)将数据集存储为向量,矩阵,数组,列表或者数据框类型。

   3)用R加载或存储下载的数据。

……………………………………………………………………

可以将该项目前1/2分成一个子任务:

1.创建一副牌。

……………………………………………………………………

-----------------------数据类型------------------------

3.1 原子型向量

R中大部分数据集都可以导入,但是从创建一副牌学会R中存储,拆解和组合数据。在R中,最简单的对象类型叫作原子型向量(atomic vector)。比如说在作业一里的对象die<-1:6。有两个常见函数可以对原子型向量进行操作:

  判断原子型向量:is.vector(die)##return TRUE/FALSE

  返还原子型向量长度:length(die)##return int

每一个原子型向量都将其值存储在其一维向量中,并且只能是一种类型的数据,R可以识别六种基本类型的原子型向量,分别是:双整形(double),整形(integer),字符型(character),逻辑型(logical),复数整型(complex)以及原始类型(raw)。

   查看对象是什么类型:typeof()

   die<-1:6

   typeof(die)##”double”

3.1.1 双整形(double)

双整形向量用来存储普通的数值型数据。数据可正可负,可大可小,可包含小数部分,也可以不包含。总之,在R中随便输入一个数值都会默认以双整形储存。也可以将其称为数值型。

3.1.2 整形(integer)

整形数据的数值不需要小数点部分,但是数值一般被存储为双整形(整形的存储方式比双整形更加精确,除非该数相当大或者相当小),所以在R中整型不太常见,明确的设定整形的方法是在数值之后加上大写字母L:

int<-c(-1L,2L,3L)

typeof(int)##”integer”

3.1.3 字符型(character)

字符型向量存储一小段文本,在R中,字符要加双引号,再组合起来构成一个字符型向量。

3.1.4 逻辑型(logical)

逻辑型向量用来存储TRUE和FALSE,这是R中布尔数据的表现形式。只要在R中全部大写TRUE(T)和FALSE(F)(不加双引号),就会被当作逻辑型数据。

3>4##FALSE

logic<-c(TRUE,FALSE,TRUE)

logic ##TRUE FALSE TRUE

3.1.5 复数类型(complex)和原始类型(raw)

复数类型用来存储复数。要生成一个复数类型向量,只需要将某个数字与带i的虚数项相加即可。

comp<-c(1+1i,1+2i,1+3i)

comp

##1+1i 1+2i 1+3i

原始类型向量用来存储数据的原始字节,如果要生成一个长度为n的空原始类型向量,可以用raw(n)。

raw(3)

##00 00 00

-----------------------数据集------------------------

3.2 属性

属性是附加给原子型向量的额外信息,可以将属性赋予一个原子型向量(或者任意一个R对象)。可以把属性理解为对象的元数据,它的作用是将与这个对象相关的信息以一种便捷的方式存起来并附加给该对象。

   查看对象包含那些属性信息:attributes(die)##NULL。

3.2.1 名称属性

一个原子型向量最常见的三种属性是:名字(name),维度(dim)和类(class)。

   查询对象的名称属性:names(die)##NULL

返回值为NULL表明die没有对象的名称属性。利用辅助函数,可以将一串字符向量赋给die对象,作为它的名称属性。这个字符向量的长度应该与die等长,每个字符元素都对应die中相应位置的元素名称。

names(die)<-c(“one”,”two”,”three”,”four”,”five”,”six”)

现在,die就有了名称属性:

 names(die)

 ##”one” ”two” ”three” ”four” ”five” ”six”

 attributes(die)

 ##$names

 ##[1] “one” ”two” ”three” ”four” ”five” ”six”

 die

 ##one two three four five six

 ##1   2   3  4   5   6

要想一次性删除名称属性值,需要将NULL赋给names函数。

names(die)<-NULL

die

##1 2 3 4 5 6

3.2.2 维度属性

原子型向量可以转换为一个n维数组,方法是用dim函数将相应的维度属性赋给该向量。

  dim(die)<-c(2,3)

  die

  ##    [,1] [,2] [,3]

  ##[1,]   1  3  5

  ##[2,]   2  4  6

  dim(die)<-c(3,2)

   die

  ##    [,1] [,2]

  ##[1,]   1  4

  ##[2,]   2  5

  ##[3,]   3  6

在分配维度属性的时候,R始终将第一个值赋给行数,将第二个值赋给列数。R对行列进行维度操纵时,行的优先权要高于列。如果想人为控制排列过程,可以使用辅助函数matrix或array。

3.3 矩阵

在R中矩阵的概念与线性代数中矩阵的概念一样。想要生成一个矩阵,首先将一个原子型向量交给函数matrix,然后使用参数nrow定义该矩阵的行数,ncol定义该矩阵的列数,默认排列方式按照列优先进行,可以设置byrow=TRUE将排列方式改为行优先。


3.4 数组

array用来生成一个n维数组。


3.5 类

常见的类型包括双整形(double),整形(integer),字符型(character),逻辑型(logical),复数整型(complex)以及原始类型(raw)。更改对象的维度并不会改变其类型,但是会改变这个对象的class属性。

dim(die)<-c(2,3)

typeof(die)

##”double”

 

class(die)

##”matrix”

3.5.1 日期与时间

除了六种普通类型外,R的属性系统还能表示更多的数据类型,比如R用类POSIXct和POSIXt表示日期和时间数据。运行Sys.time()查看计算机当前时间。

now<-Sys.time()

now

##”2014-03-17 12:00:00 UTC”

typeof(now)

##”double”

class(now)

##”POSIXct” “POSIXt”

POSIXct是一个被广泛用于表示日期与时间的框架,时间被表示为自1970年1月1日零点(UTC时间)开始逝去的秒数。可以将时间对象now的class属性移除,或者使用unclass函数也可以达到同样的效果。

class(now)<-NULL

或者

unclass(now)

##135555643

3.5.2 因子

因子在R中用来存储分类信息,因子只可以取某些特定的值,而这些值之间可能有一些特殊的顺序规律。

向factor函数传递一个原子型向量即可生成一个因子。R在显示因子信息时使用了它的levels属性,每一个1代表female,也就是levels中的第一个标签,每一个2都显示male,也就是第二个标签。如果这个因子还有数值3的话,还会显示第三个标签,以此类推。


因子的存在,使得在统计模型中加入分类变量变得更加简单,因为这些分类变量已经被编码成一些数值,但是,因子容易使人产生困惑,因为它看起来想字符串,但是表现为整数值。

在加载或者生成数据时,R会尝试将字符串变量转换为因子型。但是除非需要,否则尽量禁止R这样做。

将一个因子强制转换为字符串:as.character()

如果尝试把不同类型的数据都塞进一个向量,R会将它们全部钻转换成同一种类型的数据。包括矩阵和数组都是特殊的原子型向量,它们都只能存储在单一类型的数据。

3.6 强制转换

如果一个原子型向量包含字符串,R会将该向量中的所有元素都转换成字符型,如果一个原子型向量只包含逻辑型和数值型元素,R会将逻辑型全部转换为数值型。

强制类型转换函数:as.character(1)

                      ##”1”

                      as.logical(1)

                      ##TRUE

                      as.numeric(FALSE)

                      ##0

3.7 列表

列表将数据组织在一个一维集合中,它不是某些具体的值组织起来,而是组织R对象,如原子型向量和其他列表。


3.8 数据框

数据框将向量组织在一个二维表格之中,每一个向量都是这个表格中的一列,因此数据框的每一列都可以用来存储一种类型的数据,列与列之间的数据类型可以不同,但是每一列中的所有元素都必须是同一种类型的数据。

手动创建数据框:

df<-data.frame(face=c(“ace”,”two”,”six”),suit=c(“clubs”,”clubs”,”clubs”),value=c(1,2,3))

df

##face suit  value

## ace clubs    1

##two clubs    2

##six  clubs    3

-----------------------------注-------------------------------

1.本学习记录来自Garrett Grolemund先生所著《Hands-On Programming with R》(中文名R语言入门与实践)一书。

2.本项目所用deck数据框数据太多,可以从文件deck.csv中加载,下载地址为https://gist.github.com/garrettgman/9629323(需要翻墙)。单击Download Zip下载即可。下载之后在RStudio中单击Import Dataset->From text file导入。

3.想要更改存储路径,可以通过访问Rstudio菜单栏中的Session>Set WorkingDirectory>Choose Directory进行更改。

4. 21点(Blackjack)由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。