《R语言编程艺术》笔记2--向量

R语言最基本的数据类型是向量(Vector)。R语言中单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例。另一方面,R语言中矩阵是向量的一种特例。

循环补齐:在一定情况下自动延长向量。

筛选:提取向量子集。

向量化:对向量的每一个元素应用函数。

这些运算是R语言的核心。

R语言中变量类型称为模式(mode)。同一向量中的所有元素必须是相同的模式。可以调用函数typeof()进行查询。

2.1.1 添加后删除向量元素

与C语言类似,R中向量是连续存储的,因此不能插入或删除元素,而这跟Python语言中的数组不同。

> x <- c(88,5,12,13)
> x
[1] 88  5 12 13
> x<-c(x[1:3],168,x[4])# insert 168 before the 13
> x
[1]  88   5  12 168  13
> 

2.1.2 获取向量长度

> length(x)
[1] 5
> 

2.1.3 作为向量的矩阵和数组

> m=rbind(c(1,2),c(3,4))
> m
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> m+1:4
     [,1] [,2]
[1,]    2    5
[2,]    5    8
> 

这里2*2的矩阵m按列存储一个四元向量即(1,3,2,4)对应相加上(1,2,3,4)。

2.2 声明

通常,编译语言要求声明变量,即在使用前告诉编译器变量的存在。
和大多数脚本语言(例如Python和Perl)一样,R中不需要声明变量。
但是引用向量中的特定元素,就必须事前告知R。
> y<-vector(length=2)
> y[1]<-5
> y[2]<-8
> y[1]
[1] 5
> y
[1] 5 8
> typeof(y)
[1] "double"
> mode(y)
[1] "numeric"
> 

2.3 循环补齐

在对两个向量使用运算符时,如果要求这两个向量具有相同的长度,R会自动循环补齐(recycle),即重复较短的向量,直到它与另一个向量的长度相匹配。

> c(1,2,4)+c(6,0,9,20,22)
[1]  7  2 13 21 24
Warning message:
In c(1, 2, 4) + c(6, 0, 9, 20, 22) : 长的对象长度不是短的对象长度的整倍数
> x
[1]  88   5  12 168  13
> m
     [,1] [,2]
[1,]    1    2
[2,]    3    4
> m+c(1,2)
     [,1] [,2]
[1,]    2    3
[2,]    5    6
> 

2.4 常用的向量运算

2.4.1 向量预算和逻辑运算

> 2+3
[1] 5
> "+"(2,3)
[1] 5
> x<-c(1,2,4)
> x+c(5,0,-1)
[1] 6 2 3
> x
[1] 1 2 4
> x*c(5,0,-1)
[1]  5  0 -4
> x/c(5,4,-1)
[1]  0.2  0.5 -4.0
> x%%c(5,4,-1)
[1] 1 2 0
> 

*函数的使用方式实际上元素和元素对应相乘。

2.4.2 向量索引

索引向量的格式是向量1【向量2】,向量1中索引为向量2中的那些元素。

错误: 没有"y"这个函数
> y[2:4]
[1] 3.90 0.40 0.12
> v<-3:4
> v
[1] 3 4
> y[v]
[1] 0.40 0.12
> #负数的下标表示我们想把相应的元素剔除
> z <- c(5,12,13)
> z
[1]  5 12 13
> z[-1]
[1] 12 13
> z
[1]  5 12 13
> z[-1:-2]
[1] 13
> z
[1]  5 12 13
> k<-z[-1:-2]
> k
[1] 13

2.4.3 用:运算符创建向量

R中有一些运算符在创建向量时十分有用。它生成指定范围内数值构成的向量。
要注意优先级问题,冒号运算符的优先级要高于减号

> 
> i<-2
> i
[1] 2
> 1:i-1
[1] 0 1
> 1:(i-1)
[1] 1
> 

2.4.4 使用seq()创建向量

seq()(由sequence得来)用来生成等差数列。
> seq(from=520,to=1680,by=200)
[1]  520  720  920 1120 1320 1520
> seq(from=520,to=1680,by=200.521)
[1]  520.000  720.521  921.042 1121.563 1322.084 1522.605
> 

2.4.5 使用rep()重复向量常数

rep()(由repeat得出)函数让我们可以方便的把同一常数放在长向量中。调用的格式为rep(x,times),即创建times*length(x)个元素的向量,这个向量是x重复times次构成。
> x<-rep(520,3)
> x
[1] 520 520 520
> print(y<-rep("I love u")
+ )
[1] "I love u"
> 

2.5 使用all()和any()

all()和any()分别报告其参数是否至少有一个或全部为TRUE.

> 
> x<-1:10
> x
 [1]  1  2  3  4  5  6  7  8  9 10
> any(x>8)
[1] TRUE
> any(x>11)
[1] FALSE
> all(x>10)
[1] FALSE
> all(x>3_
错误: unexpected input in "all(x>3_"
> all(x>3)
[1] FALSE
> all(x<11)
[1] TRUE
> 

2.6 向量化运算符

2.6.1 向量输入 向量输出

> u<-c(5,2,8)
> v<-c(1,3,9)
> u>v
[1]  TRUE FALSE FALSE
> w<-function(x) return(x+1)
> w(u)
[1] 6 3 9
> sqrt(1:9)
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427 3.000000
> y<-c(1.2,3.9,0.4)
> z<-round(y)
> z
[1] 1 4 0
> k<-floor(y)
> k
[1] 1 3 0
> 

2.6.2 向量输入,矩阵输出

> z<-function(z) return(c(z,z^2))
> x<-1:8
> x
[1] 1 2 3 4 5 6 7 8
> z(x)
 [1]  1  2  3  4  5  6  7  8  1  4  9 16 25 36 49 64
> matrix(z(x),ncol=2)
     [,1] [,2]
[1,]    1    1
[2,]    2    4
[3,]    3    9
[4,]    4   16
[5,]    5   25
[6,]    6   36
[7,]    7   49
[8,]    8   64
> sapply(1:8,z)#simplify apply
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    1    4    9   16   25   36   49   64
> 

2.7 NA与NULL值

在统计数据集中,缺失值使用NA表示,NULL代表不存在的值。

2.7.1 NA的使用

跳过缺失值进行计算。
> x<-c(88,NA,12,168,13)
> x
[1]  88  NA  12 168  13
> mean(x)
[1] NA
> mean(x,na.rm=TRUE)
[1] 70.25
> y<-c(88,NULL,12,168,13)
> mean(y)
[1] 70.25
> 

2.7.2 NULL的使用

NULL是R的一种特殊对象,它没有模式。

2.8 筛选

反映R函数式语言特性的另一个特征是“筛选”(filtering)。这使我们可以提取向量中满足一定条件的元素。筛选是R中常用的运算之一。

2.8.1 生成筛选索引

> z<-c(5,2,-3,8)
> z
[1]  5  2 -3  8
> k<-(z*z>8)
> k
[1]  TRUE FALSE  TRUE  TRUE
> w<-k
> w
[1]  TRUE FALSE  TRUE  TRUE
> w<-z(k)
错误: 没有"z"这个函数
> w<-z[k]
> w
[1]  5 -3  8
> w<-z[z*z>8]
> w
[1]  5 -3  8
> 

2.8.2 使用subset()筛选

对向量使用该函数时,它与普通的筛选方法的区别在于处理NA值的方式上。
> x<-c(6,1:3,NA,12)
> x
[1]  6  1  2  3 NA 12
> x[x>5]
[1]  6 NA 12
> subset(x,x>5)
[1]  6 12
> 

当我们希望在结果中剔除NA值时,使用subset()将免去自己移除NA的麻烦。

2.8.3 选择函数which()

找到满足筛选条件的元素所在的位置
> z<-c(5,2,-3,8)
> which(z*z>8)
[1] 1 3 4
> 

2.9 向量化的ifelse()函数

ifelse (b,u,v),b是一个布尔值向量,而u和v是向量。
该函数返回的值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i]。
> x<-1:10
> y<-ifelse(x%%2==0,"偶数","奇数")
> y
 [1] "奇数" "偶数" "奇数" "偶数" "奇数" "偶数" "奇数" "偶数" "奇数" "偶数"
> 










你可能感兴趣的:(R)