美文网首页R语言知识干货
R语言与生信应用16-R语法-提取R对象的子集

R语言与生信应用16-R语法-提取R对象的子集

作者: BioSi | 来源:发表于2019-05-03 23:26 被阅读104次

    提取R对象的子集

    R中有很多操作可以提取R对象的子集。

    • [ 操作返回跟原R对象类相同的对象;可以同时提取多个对象(例外)
    • [[ 用来提取列表list或数据框dataframe对象;该操作只能用来提取单个元素,返回的对象不一定是list或数据框
    • $ 通过list和dataframe的命名name来提取元素,语义上类似于 [[
    > x <- c("a", "b", "c", "c", "d", "a")
    > x[1]
    [1] "a"
    > x[2]
    [1] "b"
    > x[1:4]
    [1] "a" "b" "c" "c"
    > x[x > "a"]
    [1] "b" "c" "c" "d"
    > u <- x > "a"
    > u
    [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE
    > x[u]
    [1] "b" "c" "c" "d"
    

    提取矩阵的子集

    矩阵的子集的提取通常通过 (i,j)来索引。

    > x <- matrix(1:6, 2, 3)
    > x
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    > x[1, 2]
    [1] 3
    > x[2, 1]
    [1] 2
    

    索引可以缺失。

    > x[1, ]
    [1] 1 3 5
    > x[, 2]
    [1] 3 4
    

    当提取矩阵的单个元素时,默认返回一个长度为1的向量,而不是一个1 × 1的矩阵。可以通过设置参数drop = FALSE来改变。

    > x <- matrix(1:6, 2, 3)
    > x[1, 2]
    [1] 3
    > x[1, 2, drop = FALSE]
         [,1]
    [1,]    3
    

    类似的,提取矩阵的一列或一行时默认返回向量,而不是矩阵。

    > x <- matrix(1:6, 2, 3)
    > x[1, ]
    [1] 1 3 5
    > x[1, , drop = FALSE]
         [,1] [,2] [,3]
    [1,]    1    3    5
    
    

    提取列表的子集

    第一个例子

    > x<-list(foo = 1:4, bar = 0.6)
    > x[1]
    $foo
    [1] 1 2 3 4
    
    > x[[1]]
    [1] 1 2 3 4
    > x$bar
    [1] 0.6
    > x[["bar"]]
    [1] 0.6
    > x["bar"]
    $bar
    [1] 0.6
    
    

    第二个例子

    > x <- list(foo = 1:4, bar = 0.6, baz = "hello")
    > x[c(1, 3)]
    $foo
    [1] 1 2 3 4
    
    $baz
    [1] "hello"
    
    

    [[ 可以使用变量或表达式作为索引;$ 只能按照命名的名称来索引。

    > x <- list(foo = 1:4, bar = 0.6, baz = "hello")
    > name <- "foo"
    ## 使用变量索引 ‘foo’
    > x[[name]]
    [1] 1 2 3 4
    ## 不存在元素名称为 ‘name’
    > x$name
    NULL
    ## ‘foo’存在
    > x$foo
    [1] 1 2 3 4
    

    提取嵌套列表(多维维列表)的子集

    [[ 可以使用整数序列作为索引。

    > x <- list(a = list(10, 12, 14), b = c(3.14, 2.81))
    > x[[c(1, 3)]]
    [1] 14
    > x[[1]][[3]]
    [1] 14
    > x[[c(2, 1)]]
    [1] 3.14
    

    局部匹配

    [[$允许名称的局部匹配来索引子集。

    > x <- list(aardvark = 1:5)
    > x$a
    [1] 1 2 3 4 5
    > x[["a"]]
    NULL
    > x[["a", exact = FALSE]]
    [1] 1 2 3 4 5
    

    去除NA值

    在进行数据分析的过程中,经常需要对缺失值(NA)进行处理。

    > x <- c(1, 2, NA, 4, NA, 5)
    > bad <- is.na(x)
    > x[!bad]
    [1] 1 2 4 5
    

    去除多个R对象的缺失值,并提取不含缺失值的子集。

    第一个例子

    > x <- c(1, 2, NA, 4, NA, 5)
    > y <- c("a", "b", NA, "d", NA, "f")
    > good <- complete.cases(x, y)
    > good
    [1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE
    > x[good]
    [1] 1 2 4 5
    > y[good]
    [1] "a" "b" "d" "f"
    

    第二个列子

    > airquality[1:6, ]
      Ozone Solar.R Wind Temp Month Day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    5    NA      NA 14.3   56     5   5
    6    28      NA 14.9   66     5   6
    > good <- complete.cases(airquality)
    > airquality[good, ][1:6, ]
      Ozone Solar.R Wind Temp Month Day
    1    41     190  7.4   67     5   1
    2    36     118  8.0   72     5   2
    3    12     149 12.6   74     5   3
    4    18     313 11.5   62     5   4
    7    23     299  8.6   65     5   7
    8    19      99 13.8   59     5   8
    

    课程分享
    生信技能树全球公益巡讲
    https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g
    B站公益74小时生信工程师教学视频合辑
    https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw
    招学徒:
    https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw

    相关文章

      网友评论

        本文标题:R语言与生信应用16-R语法-提取R对象的子集

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