• R学习 第六篇:列表


    列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型。列表项可以是列表类型,因此,列表被认为是递归变量,与之相对,向量,数组,矩阵,数据框被认为是原子变量。

    一,创建列表

    列表由list()函数创建,每个参数使用逗号分割,用于指定列表项的内容,列表中的元素数量不限,类型不限。列表项的名称是可选的,可以创建无名的列表项;列表的每一个item,都可以显示命名,例如,name1=item1, name2=item2。

    list([name1=]item1,[name2=]item2,...)

    1,创建的无名的列表项

    例如,下面的脚本创建一个列表,该列表共有三个item,第一个item是整数向量,第二个item是字符向量,第三个item是矩阵,列表的每一个item都没有名称;对于无名的列表项,只能通过嵌套的中括号[[n]]来索引列表项的元素:

    > a_list <- list(
    +     c(1:3),
    +     month.abb,
    +     matrix(c(-1,-2,-3,-4),nrow=2)
    + )

    打印列表,列表的第一个item,使用两个嵌套的中括号[[1]]表示,这是索引列表的一种方式:

    > a_list
    [[1]]
    [1] 1 2 3
    
    [[2]]
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    [[3]]
         [,1] [,2]
    [1,]   -1   -3
    [2,]   -2   -4

    2,创建命名的列表项

    通过指定列表项的变量名,为每一个列表项显示指定名称,列表项的命名是变量名,不需要加双引号;对于列表中的命名元素,可以使用美元符号$来索引列表项。

    >  a_list <- list(
    +         a=c(1:3),
    +         b=month.abb,
    +         c=matrix(c(-1,-2,-3,-4),nrow=2)
    +      )
    > a_list
    $a
    [1] 1 2 3
    
    $b
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    $c
         [,1] [,2]
    [1,]   -1   -3
    [2,]   -2   -4

    二,列表元素的命名

    使用函数names(list)查看列表中每个item的名称,如果创建列表是无名列表项,那么该函数返回NULL;可以对该函数names(list)赋值,为列表的每个item命名:

    > names(a_list) <- c('first','second','third')
    > a_list
    $first
    [1] 1 2 3
    
    $second
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    $third
         [,1] [,2]
    [1,]   -1   -3
    [2,]   -2   -4
    
    > names(a_list)
    [1] "first"  "second" "third" 

    三,列表的长度

    列表没有维度,列表和向量一样,有长度(length),可以使用函数length()获取列表的长度,列表的长度是列表的顶层item的数量,不包括嵌套的列表项。

    > length(a_list)
    [1] 3

    函数NROW(),NCOL()把列表看作向量,是只有一列,多行的数据结构,因此NCOL(x)始终返回1,而NROW(x)返回的值和length(x)相同

    > NCOL(a_list)
    [1] 1
    > NROW(a_list)
    [1] 3

    四,索引列表

    列表的下标是列表项的序号,可以使用中括号[n]索引列表的元素,下标有四种表示方法:正整数、负整数、元素名称或逻辑索引,下标的整数值从1开始,正整数表示选择该列表项,负整数表示剔除该列表项。

    例如,选择列表的第1项,第2项,分别使用正整数下标、负整数下标、元素名称和逻辑索引表示:

    > a_list[1:2]
    > a_list[-3]
    > a_list[c('first','second')]
    > a_list[c(TURE,TRUE,FALSE)] 
    
    $first
    [1] 1 2 3
    
    $second
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

    这些索引操作的结果是产生另一个列表,也就是说,使用单个中括号索引列表项,返回的结果是一个新的列表,要访问列表元素的内容,有两种方式:使用嵌套的中括号(传入正整数,代表列表项的下标,或传入字符串,代表列表项的名称),或指定元素的名称

    1,使用嵌套的中括号

    例如,通过嵌套的中括号和下标,获取列表的第一个项目(item)的值:

    > a_list[[1]]
    [1] 1 2 3

    2,使用列表的名称

    例如,通过指定元素的名称作为下标,获取列表的第一个项目(item)的值:

    > a_list$first
    [1] 1 2 3

    3,访问列表项中的元素

    在访问列表的元素之后,可以通过中括号访问列表项的元素值,例如,列表的第一个项目是向量,通过中括号和下标,能够访问向量的第一个元素的值:

    > a_list$first[1]
    [1] 1
    > a_list[[1]][1]
    [1] 1

    如果以错误的正整数索引访问列表元素的内容,R会抛出下标越界的错误,而使用错误的列表项(item)的名称,R会返回NULL值,不会报错:

    > a_list[[4]]
    Error in a_list[[4]] : subscript out of bounds
    > a_list$forth
    NULL

    ,列表项的追加、删除和更新

    列表创建之后,可以向列表中追加元素,删除现有的列表元素,更新现有的列表元素。追加元素和更新元素都是通过对元素赋值来实现的,如果列表中的元素存在,那么更新该元素;如果列表中的元素不存在,那么把当前变量添加到列表中作为新的列表项。其实,删除列表的元素,也是通过对列表项赋值来实现,只不过赋的是特殊的NULL值。

    1,删除列表元素

    NULL是各特殊值,表示一个空的变量,不会占用任何空间,长度为零。NULL能够用于删除列表中的元素,把列表项更新为NULL,则R会删除该列表项,在该列表项之后的元素,其索引序号都要减少1;在该列表项之前的元素,其索引序号不变。

    例如,把第一个列表项删除,原来的第二个列表项的索引变成1,原来的第三个列表的索引变成2:

    > a_list[1] <- NULL
    > a_list
    $second
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    
    $third
         [,1] [,2]
    [1,]   -1   -3
    [2,]   -2   -4

    2,追加列表元素

    项列表中追加新的列表项,可以使用嵌套的中括号(在列表末尾追加未命名的列表项),或直接使用新的列表项的名称(在列表末尾追加已命名的列表项):

    > a_list[[3]]=c(1:3)
    > a_list$fifth=c('a','b')

    由于通过单层中括号索引的列表项是一个列表,也可以为直接通过列表变量赋值:

    > a_list[3] <- list(c(1:3))
    > a_list["fifth"] <- list(c('a','b'))

    3,列表项的更新

    更新列表项,可以通过直接访问列表项,把列表项赋值为新的变量来实现,

    例如,把列表的第三个列表项修改为list类型的变量:

    > a_list["forth"] <- list(c('L1','L2'))
    > a_list$"forth"
    [1] "L1" "L2"

    4,更新列表项的元素

    索引列表项的元素,改变元素的值:

    > a_list$"forth"[3] <- "L3"
    > a_list$forth
    [1] "L1" "L2" "L3"

    5,把列表项更新为NULL值

    要把现有的列表元素设置为NULL值,不能简单地为其赋值为NULL,因为这将删除该列表元素,而是必须使用list(NULL)来设置,list(NULL)返回的是空的列表:

    a_list[1] <- list(NULL)

    六,列表和向量的相互转换

    向量可以使用函数as.list函数转换成列表,所创建的列表和向量中的元素一一对应,列表的每一个元素都对应向量的每一个元素:

    > v=c(1,3)
    > (l=as.list(v))
    [[1]]
    [1] 1
    
    [[2]]
    [1] 3

    列表既能存储相同的类型的数据,也能存储不同类型的数据,如果列表的所有列表项的数据类型相同,并且每一个列表项都是标量变量,可以通过unlist()函数把列表转换成向量:

    > unlist(l)
    [1] 1 3

    如果列表存储不同类型的数据,那么列表不能转换为向量。

    参考文档:

    R--列表

  • 相关阅读:
    编译问题----宏定义一定显示未定义
    低级错误记录-程序更新后,没有显示想要的结果
    云编译的优点-普及云编译
    telecommunication communication 的区别
    学习EPC架构演进历史知识
    EOF与feof的区别
    epoll惊群问题-解决思路
    epoll多路复用机制的学习
    进程组与组长进程
    记录博客开始
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4907882.html
Copyright © 2020-2023  润新知