►向量运算和逻辑运算

    R是一种函数式语言,它的每一个运算符,包括“+”,实际上也是函数。标量实际上是一元向量,因此向量也可以相加,“+”算子按元素逐一进行运算。举例如下: 

> 2 + 3

[1] 5

> "+" (2, 3)

[1] 5

> x <- c(1, 2, 4)> x + c(5, 0, -1)

[1] 6 2 3

> x * c(5, 0, -1)

[1]  5  0 -4

注:由于*函数的使用方式,实际上是元素和元素相乘。同样的道理适用于其他数值运算符。

 

►向量索引:选择或修改一个数据集的子集

    R中最重要和最常用的一个运算符是索引。一个向量的子集(subset)元素可以通过向量名后面的方括号中加入索引向量得到, 即索引向量的格式是向量1[向量2],它返回的结果是,向量1中索引为向量2的那些元素。如果一个表达式的结果是向量,则我们可以直接在表达式的末尾方括号中加入索引向量以得到结果向量的子向量。

Ю 逻辑向量

    这种情况下,索引向量必须和被挑选元素的向量长度一致。向量中对应索引向量元素为TRUE的元素将被选中,而那些对应FALSE的元素则被忽略,例如:

> y <- c( NA, 1.2, 3.9, NA, 0.4, 5.1 )

> y[ !is.na( y ) ]

[1] 1.2 3.9 0.4 5.1

Ю 正整数向量

    这种情况下,索引向量必须是{1,2,3,…,length(x) }的子向量。索引向量中索引对应的元素将会被选中,并且在结果向量中的次序和索引向量中的次序一致。。这种索引向量可以说任意长度的,结果向量的长度和索引向量完全一致。例:

> y <- c(1.2, 3.9, 0.4, 0.12)

> y[ c(1, 1, 3) ]

[1] 1.2 1.2 0.4

注:元素重复是允许的。

> y[2 : 3]

[1] 3.9 0.4

> c( "x", "y" )[ rep( c(1,2,2,1), times=3 ) ]

 [1] "x" "y" "y" "x" "x" "y" "y" "x" "x" "y" "y" "x"

Ю 负整数向量

    这种索引向量指定被排除的元素而不是包括进来。例:

> z <- c(5, 12, 13)

> z[-1]

[1] 12 13

> z[-1:-2]

[1] 13

注:负数的下标代表我们想把相应元素剔除。

Ю 字符串向量

    这可能仅仅用于一个对象可以用names属性来识别它的元素。这种情况下,名字向量的子向量可以像正整数标签一样使用。例:

> fruit <- c( 3, 5, 2, 8 )

> names( fruit ) <- c( "orange", "apple", "peach", "banana" )

> fruit[ c( "apple", "peach" ) ]

apple peach     5     2 

注:名字索引(name indices)相比数值索引(numeric indices)的好处就是容易记。该用法在数据框(data frame)操作中,优势最为明显。

 

►用运算符创建向量

    R中有一些运算符在创建向量时十分有用。

    “:”生成指定范围内数值构成的向量。

> 5 : 8

[1] 5 6 7 8

> 5 : 1

[1] 5 4 3 2 1

    要注意优先级的问题。 

> i <- 2

> 1 : i - 1

[1] 0 1

> 1 : ( i - 1 )

[1] 1

    在表达式1:i-1中,冒号优先级高于减号,因此先计算1:i,得到1 :2,然后再减去1,这意味着二元向量减去一元向量。这就要用循环补齐,一元向量(1)将扩展为(1,1),与二元向量1:2的长度匹配,按元素逐一相减,得到结果(0,1)。

    在表达式1:(i-1)中,括号的优先级高于减号,也就是说,先计算出i-1,表达式最终结果为1:1,也就是1。

 

►使用seq()创建向量

    比“:”运算符更为一般的函数是seq(),用来生成等差序列。用seq()函数可以生成指定间隔的向量。

> seq(4)

[1] 1 2 3 4

> seq(from=12, to=30, by=3)

[1] 12 15 18 21 24 27 30

> seq(from=1.1, to=2, length=10)

[1] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0

注:间隔也可以不为整数。

> x <- c(5 ,8, 10)

> x

[1]  5  8 10

> seq(x)

[1] 1 2 3

> x <- NULL

> xNULL

> seq(x)

integer(0)

注:可以看到,如果x非空,seq(x)与1:length(x)的结果相同,但如果x为空,seq(x)正确地计算出空值NULL,导致上面的循环迭代0次。

 

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

    rep()(由repeat得出)函数让我们可以方便地把同一常数放在长向量中。调用的格式是rep(x, times),即创建times*length(x)个元素的向量,这个向量由是x重复times次构成。例:

> rep(8, 4)

[1] 8 8 8 8

> rep( c(5, 12, 13), 3 )

[1]  5 12 13  5 12 13  5 12 13

> rep( 1 : 3, 2 )

[1] 1 2 3 1 2 3

> rep( c(5, 12, 13), each=3 )

[1]  5  5  5 12 12 12 13 13 13

注:rep()函数的参数each,它指定x交替重复的次数。


►使用all()和any()

    any() 和all() 函数非常方便快捷,它们分别报告其参数是否至少有一个或全部为TRUE。

> x <- 1 : 10

> any( x > 8 )

[1] TRUE

> any( x > 88 )

[1] FALSE

> all( x > 88 )

[1] FALSE

> all( x > 0 )[1] TRUE

    any()函数判断所有值是否至少一个为TURE。all()函数的功能类似,它判断这些值是否全部为TRUE。