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

2.1数据集的概念

变量的类型是不同的,比如标示符、日期变量、连续变量、名义变量、有序型变量等,记得数据挖掘导论中有专门的描述。

R可以处理的数据类型包括了数值型、字符型、逻辑型、复数型(虚数)、原生型(字节)

2.2数据结构

R拥有很多存储数据的对象类型,包括 标量、向量、矩阵、数组、数据框、列表。它们可以用下图表示:

image

因子是R中的名义型或者有序型变量,比较特殊。

2.2.1向量

标量是只有一个元素的向量,一般用来保存常量。其他没什么说的。

seq函数:

seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
    length.out = NULL, along.with = NULL, ...)
#by是增量,length.out是序列长度,along.with后面接一个向量,表明
#按照这个向量长度按照平均间隔生成一个序列

2.2.2矩阵

矩阵创建函数:

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE   , # 注意默认按列进行填充
    dimnames = NULL or(dimnames = list(rowname,colname))

关于矩阵的各种运算法则,书上没写,自己也不怎么会,因为用的不多现在,用的时候看就行了,网上一堆。

2.2.3数组

貌似自己用到的不多,array函数:

array(data = NA, dim = length(data), dimnames = NULL) 
#data是填充向量,dim是维数向量,dimnames是名称

记得有个函数是用来对行或者列进行边际求和的,margin.table等,用的时候自行百度吧再。

2.2.4数据框

书上说这是最常用的数据类型了,确实用的比较多。数据框创建函数data.frame:

data.frame(..., row.names = NULL, check.rows = FALSE,
           check.names = TRUE,
           stringsAsFactors = default.stringsAsFactors())
#check.rows 用来检查行的名称和数量是否一致,check.names 来检查变量(列)的名称是否唯一且符合语法,最后一项是用来描述是否将字符型向量自动转换为因子,默认转换,改变的话stringsAsFactors = FALSE即可。

注意数据框也是按列生成,每一列的数据类型必须一致。

好吧……看到了数据框的下标引用,自己试了试,发现一个trick,见下图:

image

 

上面的是一个数据框,请看下面的实验:

image

可以看出,数据框后面引用一个数字,代表直接引用了第几列,得到数据框;按照矩阵的方式去引用列的话,得到的是一个向量!!而用矩阵的方式引用行,得到的是数据框。R语言经常碰到这样的蛋疼情况,要十分注意。当然可以用$符号+列名引用某列(ps.中文状态下4的上面是¥,美元换成人民币…).

下面是几个函数,没用过。学一下:

1、attach和detach函数

成对使用。attach可以将数据框加入R的搜索路径中,简化代码,而detach将数据框从路径中移除。比如:

image

注意,当环境中有重名的变量时,原来变量为主。所以,这俩函数应用在名称特殊一点的数据框比较合适。

2、with函数

这个函数好像很常用,但是一直没用过:

with是一个很强大的函数,强大到,参数好像很随意

Description

Evaluate an R expression in an environment constructed from data, possibly modifying (a copy of) the original data.

Usage

with(data, expr, ...)
within(data, expr, ...)
Arguments

data    
data to use for constructing an environment. For the default with method this may be an environment, a list, a data frame, or an integer as in sys.call. For within, it can be a list or a data frame. #我理解为一种环境吧,在一种环境中进行某种操作
expr    
expression to evaluate.#进行的操作
...    
arguments to be passed to future methods.

一点一点学,碰到就学吧。书上例子比较明了:

image

下面的例子涉及到了 <<- 这个运算符,记得在听公开课的时候讲R作用域的时候听到过。这个运算符只在函数中使用,用来跳出现在的函数,在上一层的环境中为一个变量赋值。好吧,r作用域问题比较纠结。话说回来,还是不要用<<-这种运算符为好,太复杂和混乱了。

实例标识符,唯一标识一条数据观测值,data.frame()函数有参数row.names可以指定实例标识符。

2.2.5 因子

R语言中名义和顺序变量称为因子。因子非常重要,因为它决定了R中数据分析方式和如何进行视觉呈现。若用向量生成因子,R中存储的是数字向量,并且将数字与相异值相关联。

factor()函数中有一个参数ordered,若为TRUE,则生成的因子是有序因子,有序和无需因子在进行统计处理的时候是不一样对待,现在还体会不到。

factor(x = character(), levels, labels = levels,
       exclude = NA, ordered = is.ordered(x), nmax = NA)
#
x    
a vector of data, usually taking a small number of distinct values.
levels    #用来人为规定水平的对应情况
an optional vector of the values (as character strings) that x might have taken. The default is the unique set of values taken by as.character(x), sorted into increasing order of x. Note that this set can be specified as smaller than sort(unique(x)).
labels    
either an optional character vector of labels for the levels (in the same order as levels after removing those in exclude), or a character string of length 1.
exclude    #某些量不作为水平
a vector of values to be excluded when forming the set of levels. This should be of the same type as x, and will be coerced if necessary.
ordered    
logical flag to determine if the levels should be regarded as ordered (in the order given).
nmax    
an upper bound on the number of levels; see ‘Details’.
...    
(in ordered(.)): any of the above, apart from ordered itself.
ifany    
(only add an NA level if it is used, i.e. if any(is.na(x)).

这里面的好多参数没有接触过。下面把书上的代码码一遍:

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 <- factor(diabetes)
status <- factor(status,ordered = TRUE)
patientdata <- data.frame(patientID,age,diabetes,status)
str(patientdata)
summary(patientdata)

上面的代码中,注意str和summary函数的应用。

2.2.6列表

列表是最复杂的一种数据结构。去查了一下《R语言编程艺术》,列表需要注意的有:

1、[]单括号索引返回一个子列表;[[]]双重是取列表中的元素,返回的是元素本身,不是列表;

2、列表的增加z$b <- “abc”这样就可以;也可以z[2:3] <- c(TRUE,FALSE).做东西的时候发现用c也可以,不过要注意 c(list,list(newelement)).

下面有一个小trick,把忽略的代码放到if(FALSE){…}.

2.3数据的输入

R可以从各种不同的地方导入数据,如图:

image

可以从http://cran.r-project.org/doc/manuals/R-data.pdf 下载数据输入输出手册《R数据的导入和导出》。发现了一个好东西,看一看,叫做 来自google的R语言编码风格指南。

2.3.1 用键盘输入

这个方法好。首先定义一个数据框,然后调用edit函数进行编辑。

mydata <- data.frame(age = numeric(0),
                     gender = character(0))
mydata <- edit(mydata)  #这里要注意必须将edit()的结果赋值给mydata,因为edit只是对mydata的副本进行的编辑   这里的语句可以用fix(mydata)代替

numeric 函数有一个参数length,0表示没有值。
edit函数挺好用,感觉

2.3.2从csv文件中读入数据

read.table 函数

read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = ";", quote = "\"",
          dec = ",", fill = TRUE, comment.char = "", ...)

read.delim(file, header = TRUE, sep = "\t", quote = "\"",
           dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
            dec = ",", fill = TRUE, comment.char = "", ...)

#网上有详细的解释,这个函数有些复杂,实话说
函数 read.table 是读取矩形格子状数据最为便利的方式。因为实际可能 遇到的情况比较多,所以预设了一些函数。这些函数调用了 read.table 但改变了它的一些默认参数。

注意,read.table 不是一种有效地读大数值矩阵的方法: 见下面的 scan 函数。

一些需要考虑到问题是:

编码问题
如果文件中包含非-ASCII字符字段,要确保以正确的编码方式读取。 这是在UTF-8的本地系统里面读取Latin-1文件的一个主要问题。 此时,可以如下处理

          read.table(file("file.dat", encoding="latin1"))
     
注意,这在任何可以呈现Latin-1名字的本地系统里面运行。

首行问题
我们建议你明确地设定 header 参数。按照惯例,首行只有对应列的字段而 没有行标签对应的字段。因此,它会比余下的行少一个字段。 (如果需要在 R 里面看到这一行,设置 header = TRUE。) 如果要读取的文件里面有行标签的头字段(可能是空的), 以下面的方式读取

          read.table("file.dat", header = TRUE, row.names = 1)
     
列名字可以通过 col.names 显式地设定; 显式设定的名字会替换首行里面的列名字(如果存在的话)。

分隔符问题
通常,打开文件看一下就可以确定文件所使用的字段分隔符, 但对于空白分割的文件,可以选择默认的sep = "" ( 它能使用任何空白符作为分隔符,比如空格,制表符,换行符), sep = " " 或者 sep = "\t"。 注意,分隔符的选择会影响输入的被引用的字符串。

如果你有含有空字段的制表符分割的文件, 一定要使用 sep = "\t"。

引用 默认情况下,字符串可以被 " 或 ' 括起,并且两种情况下,引号内部的字符都作为 字符串的一部分。有效的引用字符(可能没有)的设置由 参数 quote 控制。对于sep = "\n", 默认值改为 quote = ""
如果没有设定分隔字符,在被引号括起的字符串里面,引号需要用 C格式的逃逸方式逃逸,即在引号前面直接加反斜杠 \。

如果设定了分隔符,在被引号括起的字符串里面,按照电子表格的习惯, 把引号重复两次以达到逃逸的效果。例如

          'One string isn''t two',"one more"
     
可以被下面的命令读取

          read.table("testfile", sep = ",")
     
这在默认分隔符的文件里面不起作用。

缺损值 默认情况下,文件是假定用 NA 表示缺损值, 但是,这可以通过参数 na.strings 改变。 参数 na.strings 是一个可以包括一个或多个 缺损值得字符描述方式的向量。
数值列的空字段也被看作是缺损值。

在数值列,值 NaN,Inf 和 -Inf 都可以被接受的。

尾部空字段省略的行
从一个电子表格中导出的文件通常会把拖尾的空字段(包括它们的分隔符) 忽略掉。为了读取这样的文件,必须设置 参数 fill = TRUE。

字符字段中的空白
如果设定了分隔符,字符字段起始和收尾处的空白会作为字段一部分看待的。 为了去掉这些空白,可以使用参数 strip.white = TRUE。

空白行
默认情况下,read.table 忽略空白行。 这可以通过设置 blank.lines.skip = FALSE 来改变。 但这个参数只有在和 fill = TRUE 共同使用时才有效。 这时,可能是用空白行表明规则数据中的缺损样本。

变量的类型
除非你采取特别的行动,read.table 将会为数据框的每个变量 选择一个合适的类型。如果字段没有缺损以及不能直接转换,它会按 logical, integer, numeric 和 complex 的 顺序依次判断字段类型。1如果所有这些类型都失败了, 变量会转变成因子。

参数 colClasses 和 as.is 提供了很大的控制权。 as.is 会 抑制字符向量转换成因子(仅仅这个功能)。 colClasses运行为输入中的每个列设置需要的类型。

注意,colClasses 和 as.is 对每 列专用, 而不是每个变量。因此,它对行标签列也同样适用(如果有的话)。

注释
默认情况下,read.table 用 # 作为注释标识字符。 如果碰到该字符(除了在被引用的字符串内),该行中随后的内容将会被忽略。 只含有空白和注释的行被当作空白行。

如果确认数据文件中没有注释内容,用 comment.char = "" 会比较安全 (也可能让速度比较快)。

逃逸
许多操作系统有在文本文件中用反斜杠作为逃逸标识字符的习惯, 但是Windows系统是个例外(在路径名中使用反斜杠)。 在 R 里面,用户可以自行设定 这种习惯是否用于数据文件。

read.table 和 scan 都有一个逻辑参数 allowEscapes。 从 R 2.2.0 开始,该参数默认为否,而且反斜杠是唯一被解释为 逃逸引用符的字符(在前面描述的环境中)。如果该参数设为是, 以C形式的逃逸规则解释,也就是控制符如 \a, \b, \f, \n, \r, \t, \v,八进制和十六进制如 \040 和 \0x2A 一样描述。任何其它逃逸字符都看着是自己,包括反斜杠。

常用函数 read.csv 和 read.delim 为 read.table 设定参数以符合英语语系本地系统中电子表格导出的CSV和制表符分割的文件。 这两个函数对应的变种 read.csv2 和 read.delim2 是针对在逗号作为小数点的国家使用时设计的2。

如果 read.table 的可选项设置不正确, 错误信息通常以下面的形式显示

     Error in scan(file = file, what = what, sep = sep, :
             line 1 did not have 5 elements
或者

     Error in read.table("files.dat", header = TRUE) :
             more columns than column names
这些信息可能足以找到问题所在,但是辅助函数 count.fields 可以进一步的深入研究问题所在。

读大的数据格子(data grid)时,效率最重要。设定 comment.char = "", 以原子向量类型(逻辑型,整型,数值型,复数型,字符型或原味型)设置每列的 colClasses ,给定需要读入的行数 nrows (适当地高估一点比不设置 这个参数好)等措施会提高效率。

网址为:http://www.biosino.org/R/R-doc/R-data_cn/Variations-on-read_002etable.html

用help(file)可以查看与读取file相关的函数,包括从文件,压缩包,网址等。

2.3.3导入excel数据

最好的方式是将excel数据另存为为上述csv文件再进行读取。可以用RODBC包读取excel数据(xls类型),表格的第一列应该包含列名,还可以从Access读取文件。读取xlsx格式的,用xlsx包用read.xlsx(file,n)函数读取excel,file是工作薄名字,n表示第几个工作表。xlsx包可以新建和编辑xlsx文件。

2.3.4xml文件

XML包可以读取、写入、操作xml文件。

2.3.5从网页抓取

可以用readLines()先把网页保存下来,然后用grep和gsub一类函数来处理。当然,更好的方式是用RCurl包和xml包提取想要的信息。

2.3.6导入SPSS数据

foreign包中的read.spss函数,Hmisc包中的spss.get()函数(这个好)。

2.3.7导入SAS数据

foreign包中的read.ssd函数,Hmisc包中的sas.get()函数(这个好)。

2.3.8~~~

书上以后还有从Stata,netCDF,HDF5读取数据,从数据库系统读取数据,先不看,还没涉及到过。

2.4变量标注

可以将数据集进行标注,便于理解。一种方式是变量名的命名,另一种是利用factor函数进行值标签标注。

2.5处理数据对象的实用函数

image

image

 

下面写几个没怎么用过的函数:

1、首先是 typeof、class、mode的区别。

我这里用个因子例子来说明,希望能讲清楚
> gl(2,5)            #新建一个因子
[1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2
> class(gl(2,5))   #查看变量的类,显示为因子;
[1] "factor"
> mode(gl(2,5))     #查看数据大类,显示为数值型;
[1] "numeric"
> typeof(gl(2,5))    #查看数据细类,显示为整数型;
[1] "integer"

转自:http://bbs.pinggu.org/thread-2587230-1-1.html

str函数用的也比较少,可以查看变量的结构,详细信息。

objects函数,可以查看数据框的列……

tail函数显示对象的最后部分。

其他的函数都比较熟悉了。

附录G中有处理GB、TB级别的数据的讨论。

下一张是绘图,很好,要好好学一下。

posted @ 2015-08-04 16:58  司空格子Ored  阅读(5121)  评论(0编辑  收藏  举报