R 学习笔记(1) -- 向量

作者: wangpeng905 | 来源:发表于2017-03-28 17:44 被阅读92次

    向量是 R 最基本的变量

    R 中变量的类型称为模式。

    R 中最基本的变量类型是向量,一维的向量,没有标量,任何一个看似标量的变量其实都是长度为 1 的向量。

    R 中同一向量中元素类型必须相同,例如整型,浮点型,字符型,布尔型。

    R 中向量是连续存储的,因此不能插入或者删除,如果要实现插入或删除必须为向量重新赋值。

    R 中向量进行运算时,会自动进行循环补齐,短向量循环补齐到长向量的长度再进行运算。

    R 中的矩阵实际是一个长向量。

    
    > x <- c(1,2,3)
    
    > x
    
    [1] 1 2 3
    
    > x + 1
    
    [1] 2 3 4
    
    > # 实际运行的是 (1,2,3) + (1,1,1)
    
    

    许多 R 的内置函数在对变量进行运算时,也是向量化运算,即对向量的每一个元素进行函数运算。


    seq 函数

    比 : 更常用的是 seq(from, to, by) 函数 (sequence),来生成等差序列:

    
    > seq(1,10)
    
    [1] 1 2 3 4 5 6 7 8 9 10
    
    > seq(from=1,to=10,by=2)
    
    [1] 1 3 5 7 9
    
    > seq(1,10,3)
    
    [1] 1 4 7 10
    
    

    rep 函数

    rep (指repeat) 函数形式,rep(x,times) 创建重复 times*length(x) 个元素的向量,把 x 重复 times 次。

    
    > rep(8,4)
    
    [1] 8 8 8 8
    
    > rep(c(1,2,3),3)
    
    [1] 1 2 3 1 2 3 1 2 3
    
    > rep(1:3,3)
    
    [1] 1 2 3 1 2 3 1 2 3
    
    > # rep 函数还有一个 each 参数,与 times 不同,each 指定 x 交叉重复的次数
    
    > rep(c(1,2,3),each=2)
    
    [1] 1 1 2 2 3 3
    
    > rep(c(1,2,3),each=3)
    
    [1] 1 1 1 2 2 2 3 3 3
    
    

    NULL

    NULL 是 R 的一种特殊对象,没有模式,没有长度,为空。对向量某个元素赋值为 NULL 可以删除该元素。


    筛选

    筛选是 R 中最常用的运算之一。

    
    > z <- c(5,2,-3,8)
    
    > w <- z[z*z > 8]
    
    > w
    
    [1] 5 -3 8
    
    > z
    
    [1] 5 2 -3 8
    
    > z*z
    
    [1] 25 4 9 64
    
    > # 实际运算是(25,4,9,64) > (8,8,8,8),结果也是一个四元向量,值为布尔型
    
    > z*z > 8
    
    [1] TRUE FALSE TRUE TRUE
    
    > z[c(TRUE,FALSE,TRUE,TRUE)]
    
    [1] 5 -3 8
    
    

    ifelse()

    向量化的 ifelse() 函数, ifelse(b,u,v), b 是布尔型向量,u,v 都是向量。

    
    > x <- c(5,2,9,12)
    
    > ifelse(x > 6, 2*x, 3*x)
    
    [1] 15 6 18 24
    
    > # 效果相当于 ifelse(c(FALSE,FALSE,TRUE,TRUE),c(10,4,18,24),c(15,6,27,36)),但实际 R 使用“惰性求值”,只有在需要时表达式才会计算,否则不计算。
    
    

    相对于标准的 if-then-else 结构,ifelse() 是向量化语句,因此有可能快很多。


    测试向量相等

    不能直接用 ==,因为 == 是一个向量化运算,可以结合 all() 函数。

    
    > x <- 1:3
    
    > y <- c(1,3,4)
    
    > x == y
    
    [1] TRUE FALSE FALSE
    
    > all(x==y)
    
    [1] FALSE
    
    

    可以简单地使用 identical() 函数。

    
    > identical(x,y)
    
    [1] FALSE
    
    

    identical() 是判断两个向量是否完全相同,包括类型是否相同。使用 identical() 要小心,看如下例子:

    
    > x <- 1:3
    
    > y <- c(1,2,3)
    
    > identical(x,y)
    
    [1] FALSE
    
    > # 符号 : 产生的是整数,而 c() 产生的是浮点数
    
    > typeof(x)
    
    [1] "integer"
    
    > typeof(y)
    
    [1] "double"
    
    

    连接函数 c()

    如果传递到 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
    
    

    与 Python 不同,c() 函数对向量有扁平化的效果。

    
    > c(5,2,c(1.5,6))
    
    [1] 5.0 2.0 1.5 6.0
    
    

    奇怪的东西

    在谢益辉主笔的《R语言忍者秘笈》中看到几个例子,由于计算机存储数据精度的问题,有些运算会出现莫名其妙的结果:

    > x <- seq(0,1,0.1)
    > x
     [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
    > y <- c(0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1)
    > y
     [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
    > x == y
     [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
    > 0.3 - 0.7 + 0.4 == 0
    [1] FALSE
    > sqrt(2)^2 == 2
    [1] FALSE
    

    具有新想法的人在其想法实现之前是个怪人。

    相关文章

      网友评论

        本文标题:R 学习笔记(1) -- 向量

        本文链接:https://www.haomeiwen.com/subject/aqxsottx.html