1. R的历史
R是一个有着统计分析功能及强大作图功能的软件系统,是由奥克兰大学统计学系的Ross Ihaka和Robert Gentleman 共同创立。由于他们的名字的首字母都是R,因此R便成了这门语言的名称。R受到了贝尔实验室的S语言的影响,因此R又被称之为S语言的方言。
2. 寻求帮助
在学习R的过程中寻求帮助的方法主要分三种谷歌一下、去论坛提问和发邮件。
2.1 谷歌一下
在我们使用R的时候可能会遇到的一些问题,首先我们需要将问题或者错误的提示信息粘贴到谷歌中去。目前的翻墙方法有很多,如xx-net和使用翻墙浏览器等。我登陆谷歌的方法是使用天行者浏览器来登录谷歌,目前是可以正常使用的。
2.2 论坛和邮件
如果谷歌没法帮我们解决问题,那么我们就需要到论坛或邮件列表去咨询。在咨询的时候需要注意以下几点:
提供一个可以再现错误的例子,为了达到的目的是什么,使用的R的操作系统、R的版本以及R package的版本等。
3. 数据类型和数据结构
3.1 基本数据类型
在R语言里操作和接触的所有东西都称作对象 (object)。对象有很多种类 可以包含各种类型的数据。R 语言里所有的东西都被称为对象,R语言中常见的数据类型有几下几种,分别是字符型 (character)、数值型 (numeric)、整型 (integer)、复数型 (complex)、因子型(factor)以及逻辑型 (logical)。R语言里最常见的基本对象是向量 (vector),一个向量可以包含同一类型的多个对象。
数值型 (numeric):一般数字形式的数据都为数值型(实数或者小数),从传统的数据分类方式来看,即指定量变量。
> x <- c(1,2,3,4,5) # 构造元素为1,2,3,4,5的向量x
> x # 输出x的值
[1] 1 2 3 4 5
> class(x) # 显示x的数据类型
[1] "numeric"
整型 (integer):仅含有整数,且设定数据类型为integer,否则一般为数值型。
> x1 = as.integer(x) # 将x转化为整数型数据x1
> class(x1) # 显示向量x1的数据类型
[1] "integer"
复数型 (complex number):
> x2 <- complex(1,1)
> x2
[1] 1+0i
> Mod(x2)
[1] 1
> Conj(x2)
[1] 1+0i
> x3 <- c(1+0i,2+4i)
> x3
[1] 1+0i 2+4i
> Mod(x3)
[1] 1.000000 4.472136
> Conj(x3)
[1] 1+0i 2-4i
其中i是个特殊符号,代表复数的虚部(imaginary part)。
逻辑型 (logical):取TRUE和FALSE两个固定值,用于指示判断结果。
> x = c(1,2,3,4,5) # 构造元素依次为1,2,3,4,5的向量x
> x
[1] 1 2 3 4 5
> x ==2 # 判断向量x中等于2的元素
[1] FALSE TRUE FALSE FALSE FALSE
> !(x < 2) # 判断向量x中大于等于2的元素
[1] FALSE TRUE TRUE TRUE TRUE
> which(x < 2) # 选择向量中小于2的元素
[1] 1
> is.logical(x) # 判断向量x是否为逻辑型数据
[1] FALSE
字符型 (character):指向量中每个元素都是一个字符或字符串,即一般的数据分类方式中所说的定性变量。
> y <- c("I","love","R") # 构造元素为字符串"I"、"love"、"R"的向量R
> y # 输出y的值
[1] "I""love" "R"
> class(y) # 显示向量y的数据类型
[1] "character"
> length(y) # 显示向量y的维度,也就是y的元素个数
[1] 3
> nchar(y) # 显示向量y中每个元素的字符的个数
[1] 1 4 1
> y == "R" # 判断向量y中为"R"的元素
[1] FALSE FALSE TRUE
因子型(factor):因子型数据类型简单来说就是披着定量数据外壳的定性数据,即以数字代码的形式表现的字符型数据,本质上为定性数据。
因子 (factor) 是一种特殊的向量类型,通常用来记录分类数据。因子有两种类型:有序的以及无序的。无序因子可以认为是用来标记那些有标签有类别但是又没有顺序的数据,比如说男性和女性。序因子可以用来标记那些有先后次序的数据,这些数据可以不是数值型的,但却是有序的。例如大学的助理教授、副教授以及正教授,这就是一种有序的分类。所以可以把有序因子当作是一个整型向量,其中每个整数都有一个标签。例如一个由1、2、3组成的向量,1代表较高的值,2代表一个中等的值,3代表一个较低的值。这三个变量将会有三个标签,分别是高、中、低,在R当中分别用1、2、3来表示。
可以使用factor()函数来创建因子,命令如下:
> sex = factor(c(1,0,1,1,0,1),levels = c(0,1),labels = c("male","female")) # 设置因子型数据sex
> sex # 输出sex的值
[1] female male female female male female
Levels: male female
> class(sex) # 显示sex的数据类型
[1] "factor"
创建一个含有两个level(yes和no)的简单因子,命令如下:
> x <- factor(c("yes","yes","no","yes","no"))
> x
[1] yes yes no yes no
Levels: no yes
> table(x) # table()函数会给出每个水平出现的频率
x
no yes
2 3
> unclass(x) # unclass() 函数能够去掉分类信息,使x变为一个整型向量
[1] 2 2 1 2 1
> attr(,"levels")
[1] "no" "yes"
一个向量可以包含单一类型的多个对象,因此可以有实数向量或整数向量。但是一个标准的向量不能包含不同类型的对象,同一个向量里的所有对象都必须是同一类型的。如果一个向量中包含两种不同类型的对象,那么R会创建最低级公共类型(least common denominator)的向量。此时R不会报错,而是将向量强制转换成(coerce)为二者的最低级公共类型。例如:
> y1 <- c(1.7,"a")
> y1
[1] "1.7" "a"
> class(y1)
[1] "character"
> y2 <- c(TRUE,2)
> y2 # 在R的约定里,TRUE代表1,FALSE代表0
[1] 1 2
> class(y2)
[1] "numeric"
> y3 <- c("a", TRUE)
> y3
[1] "a""TRUE"
> class(y3)
[1] "character"
若想强制转换对象的类型,可以使用as.numeric()、as.logical()、as.charcater()函数进行强制转换。
> x <- 0:6
> x
[1] 0 1 2 3 4 5 6
> class(x)
[1] "integer"
> as.numeric(x)
[1] 0 1 2 3 4 5 6
> class(x)
[1] "integer"
> as.logical(x) # 根据约定0转换成FALSE,所有大于0的数都转换成TRUE
[1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE
> class(x)
[1] "integer"
> as.character(x)
[1] "0" "1" "2" "3" "4" "5" "6"
> class(x)
[1] "integer"
强制转换也不一定一直成功,如果它失败了就会返回NA值。所有无意义的强制转换就会导致NA值。
> y <- c("a","b","c")
> y
[1] "a" "b" "c"
> as.numeric(y)
[1] NA NA NA
Warning message:
NAs introduced by coercion
> as.logical(y)
[1] NA NA NA
> as.complex(y)
[1] NA NA NA
Warning message:
NAs introduced by coercion
> x <- 0:6
> as.complex(x)
[1] 0+0i 1+0i 2+0i 3+0i 4+0i 5+0i 6+0i
3.2 数据结构
3.2.1 向量
最简单的数据结构就是由一串有序数值构成的数值向量(vector)。假如我们要创建一个含有五个数值的向量x,且这五个值分别为1,3,5,7和9,则 R 中的命令为:
> x <- c(1,3,5,7,9)
> x
[1] 1 3 5 7 9
3.2.2 矩阵
矩阵(matrix)是R里的一类特殊向量,它们不是一种单一的数据类型,而是有维度(dimension)属性的向量。维度属性是一个整型向量,它的长度为2。其中第一个数字是矩阵的行数,第二个数字是矩阵的列数。
> m <- matrix(nrow = 2, ncol = 3) # matrix() 函数来创建一个2行3列的空矩阵
> m
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA
> dim(m) # 使用dim()函数返回矩阵的维度属性:在这里为2行3列
[1] 2 3
> attributes(m) # 使用attributes()函数将返回一个列表,其中的第一个元素是dim,dim中包含向量(2,3)
$dim
[1] 2 3
这就是矩阵的所有特性 它是一个具有维度属性的向量。矩阵是按列生成的,你可以把这个过程想象成把一个向量里的所有数按列填入矩阵中,先填第一列,填完第一列最后一行的数字后再填第二列,然后是第三列等等。
例如使用1到6的数列创建一个矩阵,指定这个矩阵有2行3列,输入命令如下:
> n <- matrix(1:6, nrow = 2, ncol = 3)
> n
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
可以通过为向量创建维度属性来创建矩阵,命令如下:
> m <- 1:10 # 先创建一个1到10的数列m
> m
[1] 1 2 3 4 5 6 7 8 9 10
> dim(m) <- c(2,5) # 使用dim()函数对数列m添加维度,把1到10的向量转变成2行5列的矩阵
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
还有一种创建矩阵的方法,通过绑定行或者列来创建。通过使用cbind()和rbind()函数来创建,命令如下:
> x <- 1:3 # 构建向量x
> x
[1] 1 2 3
> y <- 10:12 # 构建向量y
> y
[1] 10 11 12
> cbind(x, y) # 使用cbind()函数以列排布的形式合并向量x和y,生成3行2列的矩阵
x y
[1,] 1 10
[2,] 2 11
[3,] 3 12
> rbind(x, y) # 使用rbind()函数以行排布的形式合并向量x和y,生成2行3列的矩阵
[,1] [,2] [,3]
x 1 2 3
y 10 11 12
3.2.3 列表
可以包含多种类型的对象的向量叫做列表(list),列表是一个向量是一个由多个对象组成的序列,只是其中每个对象的类型可以各不相同。比方说一个列表可以包含字符型、数值型和逻辑型的对象,也可以包含一个列表。
列表的每个元素可以是不同类型的对象,这就让列表可以轻松存放各种类型的数据。在R中列表是非常有用而且常用的对象,尤其是在和其它我们即将学到的函数类型一起使用时。
例如使用list()函数创建一个列表 x,第一个元素是数值对象1,第二个元素是字符 “a”,第三个是逻辑值TRUE,第四个是复数。命令如下:
> x <- list(1,"a",TRUE,1+4i)
> x
[[1]]
[1] 1
[[2]]
[1] "a"
[[3]]
[1] TRUE
[[4]]
[1] 1+4i
在输出结果中双层的中括号[[]],列表的元素用[[]]里面的数字进行索引(index)。所以第一个元素是向量1,第二个元素是向量 “a”,第三个元素是向量TRUE,第四个元素是复数向量1+4i。
列表元素由[[]]包围,其他向量的元素则只有[],这是把列表和其他类型的向量区分开的一种方法。
列表中的元素还可以是数据框(data frame)。所以组成列表的元素可以是任何类型的对象,这也是列表会这么有用的原因。数据框可以理解是一个松散的数据集。它可以是由不同类型的列( 数字、 因子、 字符等)组成的类矩阵( matrix-like)。
|