美文网首页程序员
学习R记录 <- 基础4(列表与数据框)

学习R记录 <- 基础4(列表与数据框)

作者: limbo1996 | 来源:发表于2019-03-25 19:35 被阅读7次

    列表与数据框
    到目前为止,向量、数组、矩阵这些前面提到的所包含的元素类型都是相同的,而列表数据框允许把不同的数据类型合并到单一变量中。

    1.列表

    1.1 创建列表

    创建列表使用list函数,列表中的元素类型不限,可以是向量、矩阵,甚至还可以是函数。

    > a <- list(
    +   c(1,2,3,4,5),
    +   month.abb,
    +   matrix(c(3, -8, 1, -3), nrow = 2),
    +   asin
    + )
    > a
    [[1]]
    [1] 1 2 3 4 5
    
    [[2]]
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    [[3]]
         [,1] [,2]
    [1,]    3    1
    [2,]   -8   -3
    
    [[4]]
    function (x)  .Primitive("asin")
    

    同样的,你也可以给列表命名。

    > names(a) <- c('catalan', 'months', 'involutary', 'arcsin') 
    > a
    $catalan
    [1] 1 2 3 4 5
    
    $months
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    $involutary
         [,1] [,2]
    [1,]    3    1
    [2,]   -8   -3
    
    $arcsin
    function (x)  .Primitive("asin")
    

    同样你也可以把此列表当作另一个列表的元素。

    1.2 原子变量和递归变量

    这里有一个概念:因为列表有把其他列表包含在内的能力,所以被称为递归变量, 与之相对的向量、矩阵、数组被称为原子变量

    1.3 索引列表

    我们可以使用[]、正负下标数或者元素名称,逻辑索引来访问列表元素,
    值得注意的是,索引操作的结果产生了另一个列表, 所以当你要访问列表元素的内容,需要使用[[]]双方括号

    > a
    [[1]]
    [1] 1 2 3 4 5
    
    [[2]]
    [1]  6  7  8  9 10
    
    [[3]]
    [1] "dsa"
    
    > a[1]
    [[1]]
    [1] 1 2 3 4 5
    
    > a[[1]]
    [1] 1 2 3 4 5
    

    使用函数is.list会更直观:

    > a[[1]]
    [1] 1 2 3 4 5
    > is.list(a)
    [1] TRUE
    > is.list(a[1])
    [1] TRUE
    > is.list(a[[1]])
    [1] FALSE
    

    当然对于已经命名的元素可以使用$来访问其值。这就有点类似于shell了。

    1.4 向量与列表的转换

    > b <- c(1,2,3,4)
    > c <- as.list(b)
    > b
    [1] 1 2 3 4
    > c
    [[1]]
    [1] 1
    
    [[2]]
    [1] 2
    
    [[3]]
    [1] 3
    
    [[4]]
    [1] 4
    
    > is.list(c)
    [1] TRUE
    

    如上,使用函数as.list可以完成转化。
    当然列表也可以转化成向量

    • 当列表中元素都是标量时,使用函数as.numeric等可以将列表转换为不同类型的向量。
    • 当列表中的元素包含非标量, 那这就是一个问题了,可以先使用函数unlist将其转化为向量

    1.5NULL值

    NULL值是一个特殊值,它表示的是一个空的变量,有时候你创建一个列表时,有的元素必须存在但是目前还没有赋值,就可以用NULL来表示。
    需要区分的是NULL和NA它们有很大区别,其中一个区别就是NULL的长度为0——NULL不会占用任何空间;而NA是一个标量,长度为1

    > length(NULL)
    [1] 0
    > length(NA)
    [1] 1
    

    2. 数据框

    数据框十分常见,它就类似于一个电子表格。

    2.1 创建数据框

    使用函数data.frame可以创建数据框:

    > c <- data.frame(x = c(1:5), y = rnorm(5), z = runif(5) > 0.5)
    > c
      x          y     z
    1 1 -0.8818198  TRUE
    2 2  1.1158819  TRUE
    3 3  0.4585993  TRUE
    4 4  0.8917424 FALSE
    5 5  0.7377649  TRUE
    

    在数据框中每一列的数据类型必须相同,但是列与列之间类型可以不同。
    每一行的名字可以使用参数row.names来命名

    > row.names(c) <- c('A', 'B', 'C', 'D', 'E')
    > c
      x           y     z
    A 1 -1.00220443 FALSE
    B 2 -0.81289684  TRUE
    C 3 -0.79172877 FALSE
    D 4  0.19666573  TRUE
    E 5 -0.04511619 FALSE
    

    其实几乎所有的矩阵的函数都可以用在数据框上

    > rownames(c)
    [1] "A" "B" "C" "D" "E"
    > colnames(c)
    [1] "x" "y" "z"
    > dimnames(c)
    [[1]]
    [1] "A" "B" "C" "D" "E"
    
    [[2]]
    [1] "x" "y" "z"
    
    > nrow(c)
    [1] 5
    > ncol(c)
    [1] 3
    > dim(c)
    [1] 5 3
    > length(c)
    [1] 3
    > names(c)
    [1] "x" "y" "z"
    

    有点不同的是函数length返回和函数ncol一样的值即列数,names函数返回的也是列名。

    相关文章

      网友评论

        本文标题:学习R记录 <- 基础4(列表与数据框)

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