R:向量


    向量类型是R语言的核心。R语言最基本的数据类型是向量(vector)。与C语言家族不同,R语言中,单个数值(标量)没有单独的数据类型,它只不过是向量的一种特例,而另一方面,R语言中矩阵是向量的一种特例。

    R语言中变量类型称为模式(mode)。同一向量的所有元素必须属于相同的模式,或者说是数据类型,即整型、数值型(浮点数)、字符型(字符串)、逻辑型(布尔逻辑)、复数型等等。一个向量可以由三个字符串组成(字符模式),或者由三个整数元素组成(整数模式),但不可以由一个整数元素和两个字符串元素组成。

    如果在程序中查看变量x的类型,可以调用函数typeof(x)进行查询。

 

创建向量

    向量用于存储数值型、字符型或逻辑型数据的一组数组。执行组合功能的函数c()可用来创建向量。

> c <- c( 1, 2, 3, 4, 5 )

注:>赋值可以用函数assign()实现。如:assign( "c", c( 1, 2, 3, 4, 5 ) ),此命令和上面的赋值命令等价。

> c <- c( "one", "two", "three", "four", "five" )

> c <- c( TRUE, FALSE, FALSE, TRUE, TRUE )

注:标量是只含一个元素的向量。

 

►声明

    通常,编译语言要求声明变量,即在使用之前告诉编译器变量的存在。和大多数的脚本语言一样,R中不需要声明变量。

    但是,如果要引用向量中特定的元素,就必须事先告知R。通过在方括号中给定元素所处位置的数值,可以访问向量中的元素。例如,我们希望y是一个二元向量,由5和12两元素构成。下面的语句无法正常工作:

> y[1] <- 5

> y[2] <- 12

    对于上面的例子,必须先创建y,比如按这种方式:

> y <- vector(length=2)

> y[1] <- 5

> y[2] <- 12

或者:

> y <- c(5,12)

    我们写R代码的时候,不能突然冒出诸如y[2]这样的语句,其原因归咎于R这种函数式语言的特性。在函数式语言中,读写向量中的元素,实际上由函数来完成。如果R事先不知道y是一个向量,那么函数将没有执行的对象。

    对于绑定,由于变量没有事先声明,则它们的类型不受限制。

 

►向量元素的名称

可以给向量元素随意指定名称。可以用names()函数给向量中的元素命名,或查询向量元素的名称。

> x <- c( 1, 2, 4 )

> names( x )

NULL

> names( x ) <- c( "a", "b", "c" )

> names( x )

[1] "a" "b" "c"

> x

a b c 1 2 4 

    把向量元素名称赋值为NULL,可以将其移除。

> names( x ) <- NULL

> x

[1] 1 2 4

    可以用名称来引用向量中的元素。

> x <- c( 1, 2, 4 )

> names( x ) <- c( "a", "b", "c" )

> x["b"]

b 2

 

►添加或删除向量

    R向量是连续存储的,因此不能插入或删除元素。在R中,向量的大小在创建时已经确定,因此,如果想要添加或删除元素,需要重新给向量赋值。R中向量索引从1开始。

    例如,把一个元素添加到一个四元向量的中间,如下代码所示:

>x <- c(  88, 5, 12, 13)

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

>x

[1] 88 5 12 168 13

 

    在这里,我们创建了一个四元向量,赋值给x。为了在其第三和第四元素之间插入一个新的元素168,我们把x的前三个元素、168和x的第四个元素按顺序连起来,这样就创建出新的五元向量,而此时x并没发生变化。接下来再把这个新的向量赋值给x。

    这一结果看似已经改变了x中存储的向量,但实际上创建了新的向量并把它存储到x。这样的区别看上去可能微乎其微,但它是有影响的。例如,在某些情况下,它可能限制R的快速执行的潜力。

 

►获取向量长度

    可以使用函数length()获取向量的长度。举例如下:

> x <- c(1,2,4)

> length(x)

[1] 3


►循环补齐

    在算术表达式中使用向量将会对该向量的每一个元素都进行同样算术运算。出现在同一个表达式中的向量最好是长度一致。如果他们的长度不一样,该表达式的值将是一个和其中最长向量等长的向量。表达式中短的向量会被循环使用以达到最长向量的长度,也就是自动循环补齐(recycle)(即重复较短的向量,直到它与另一个向量长度相匹配)。举例如下:

> c(1,2,3)+c(1,2,3,4,5)

[1] 2 4 6 5 7

 Warning message: 

longer object length is not a multiple of shorter object in:c(1, 2, 3) + c(1, 2, 3, 4, 5)  

    例子中较短的向量被循环补齐,因此运算实际上执行的是:c(1,2,3,1,2)+c(1,2,3,4,5)。

下面的例子更为巧妙:

>x

     [,1]  [,2]

[1,]   1    4

[2,]   2    5

[3,]   3    6

>x + c(1,2)

     [,1]  [,2]

[1,]   2    6

[2,]   4    6

[3,]   4    8

    矩阵,实际上是个长向量。在这里,3 2的矩阵x是一个6元向量,它在R中一列一列存储,即在存储方面,x与c(1,2,3,4,5,6)相同。我们把二元向量c(1,2)加到这个六元向量上,则所加的二元向量要再重复两次才能变成六个元素。即实际上执行的运算是:x+c(1,2,1,2,1,2)。

 

►其他

    如果传递到c()中的参数有不同的类型,则他们将被降级为同一类型,该类型最大限度地保留它们的共同特性。

> c( 5, 2, "abc" )

[1] "5"   "2"   "abc"

> c( 5, 2, list( a=1, b=4 ) )

[[1]][1] 5 [[2]][1] 2 $a[1] 1 $b[1] 4

    在第一个例子中,我们混合了整数型和字符型,R会选择把它们都转换为后者的类型。在第二个例子中,对于混合的表达式,R认为列表类型有较低的优先级。


    C()函数对向量有扁平化的效果。

> c( 5, 2, c( 1.5, 6 ) )

[1] 5.0 2.0 1.5 6.0

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值