标签: R语言

  • 第七章 R语言中的列表

    列表是一个能组织值、向量、数据框、矩阵等的容器,可以把各种变量按照顺序组织在一起。

    还是以表4-1为例,我们知道,计算只能在数值上,那么,实际上数据框是不适合直接计算的。我们把这个数据框改成列表。

    数据表4-1

    姓名性别英语成绩评定
    张三95优秀
    李四84良好
    王五61合格
    name <- c("张三","李四","王五")
    gender <- c("男","女","男")
    English_score <- c(95,84,61)
    English_grade <- c("优秀","良好","合格")
    # 创建列表
    English_class <- list(name,gender,English_score,English_grade)
    # 显示列表内容
    English_class
    

    结果如下:

    > English_class
    [[1]]
    [1] "张三" "李四" "王五"
    
    [[2]]
    [1] "男" "女" "男"
    
    [[3]]
    [1] 95 84 61
    
    [[4]]
    [1] "优秀" "良好" "合格"

    像其他数据组织形式一样,列表也能命名。

    English_class <- list("姓名" = name, "性别" = gender, "英语成绩" = English_score, "英语评级" = English_grade)
    English_class
    

    结果如下:

    $姓名
    [1] "张三" "李四" "王五"
    
    $性别
    [1] "男" "女" "男"
    
    $英语成绩
    [1] 95 84 61
    
    $英语评级
    [1] "优秀" "良好" "合格"

    数据的提取:

    # 提取列表中的第一个元素,以列表形式展现
    English_class[1]
    
    # 提取列表中的第一个元素,以非列表形式展现,如向量、矩阵
    English_class[[1]]
    
    # 提取列表中第一个元素的第一个元素
    English_class[[1]][1]
    unlist(English_class[1])[1]
    
    # 已经命名的列表,可以用$符号提取元素,也可以直接用名称提取
    English_class["姓名"]
    English_class[["姓名"]]
    English_class$姓名
    English_class$姓名[1]
    

    结果如下:

    > # 提取列表中的第一个元素,以列表形式展现
    > English_class[1]
    $姓名
    [1] "张三" "李四" "王五"
    
    > 
    > # 提取列表中的第一个元素,以非列表形式展现,如向量、矩阵
    > English_class[[1]]
    [1] "张三" "李四" "王五"
    > 
    > # 提取列表中第一个元素的第一个元素
    > English_class[[1]][1]
    [1] "张三"
    > unlist(English_class[1])[1]
     姓名1 
    "张三" 
    > 
    > # 已经命名的列表,可以用$符号提取元素,也可以直接用名称提取
    > English_class["姓名"]
    $姓名
    [1] "张三" "李四" "王五"
    
    > English_class[["姓名"]]
    [1] "张三" "李四" "王五"
    > English_class$姓名
    [1] "张三" "李四" "王五"
    > English_class$姓名[1]
    [1] "张三"

    列表是有长度的,列表中元素的个数即为列表的长度,列表中某个元素中子元素的个数,为该子元素的长度。

    # 列表的长度
    length(English_class)
    # 列表中,子元素"姓名"的长度
    length(English_class$姓名)
    

    结果如下:

    > length(English_class)
    [1] 4
    > length(English_class$姓名)
    [1] 3

    我们可以向列表中添加内容,也就是元素。比如我们要加入数学和语文成绩。

    # 向列表中添加元素
    English_class[[length(English_class) + 1]] <- data.frame("数学成绩" = c(99, 88, 77), "语文成绩" = c(66, 55, 44))
    

    结果如下:

    > English_class
    $姓名
    [1] "张三" "李四" "王五"
    
    $性别
    [1] "男" "女" "男"
    
    $英语成绩
    [1] 95 84 61
    
    $英语评级
    [1] "优秀" "良好" "合格"
    
    [[5]]
      数学成绩 语文成绩
    1       99       66
    2       88       55
    3       77       44

    删除列表中的元素也是非常简单的,类似于向量的操作。

    # 删除元素
    (English_class[-2])   # 删除性别
    (English_class[[3]] <- NULL)   # 删除英语成绩
    English_class
    

    结果如下:

    > (English_class[-2])
    $姓名
    [1] "张三" "李四" "王五"
    
    $英语成绩
    [1] 95 84 61
    
    $英语评级
    [1] "优秀" "良好" "合格"
    
    [[4]]
      数学成绩 语文成绩
    1       99       66
    2       88       55
    3       77       44
    
    > (English_class[[3]] <- NULL)
    NULL
    > English_class
    $姓名
    [1] "张三" "李四" "王五"
    
    $性别
    [1] "男" "女" "男"
    
    $英语评级
    [1] "优秀" "良好" "合格"
    
    [[4]]
      数学成绩 语文成绩
    1       99       66
    2       88       55
    3       77       44

    列表是可以叠加的,把一个列表和另一个列表相连。我们把数学成绩和语文成绩从这个列表中删除,然后放在另一个列表内。

    (English_class[-4])
    other_score <- list("数学成绩" = c(99, 88, 77), "语文成绩" = c(66, 55, 44))
    list_in_list <- list(English_class,other_score)   # list_in_list <- append(English_class,other_score)两者有区别
    list_in_list
    

    结果如下:

    > (English_class[-4])
    $姓名
    [1] "张三" "李四" "王五"
    
    $性别
    [1] "男" "女" "男"
    
    $英语评级
    [1] "优秀" "良好" "合格"
    
    > other_score <- list("数学成绩" = c(99, 88, 77), "语文成绩" = c(66, 55, 44))
    > other_score
    $数学成绩
    [1] 99 88 77
    
    $语文成绩
    [1] 66 55 44
    
    > list_in_list <- list(English_class,other_score)
    > list_in_list
    [[1]]
    [[1]]$姓名
    [1] "张三" "李四" "王五"
    
    [[1]]$性别
    [1] "男" "女" "男"
    
    [[1]]$英语评级
    [1] "优秀" "良好" "合格"
    
    [[2]]
    [[2]]$数学成绩
    [1] 99 88 77
    
    [[2]]$语文成绩
    [1] 66 55 44

    类似的,查看列表的元素,可以用下面的代码。

    list_in_list[[1]]
    list_in_list[[2]]
    list_in_list[[1]]$姓名
    

    结果如下:

    > list_in_list[[1]]
    $姓名
    [1] "张三" "李四" "王五"
    
    $性别
    [1] "男" "女" "男"
    
    $英语评级
    [1] "优秀" "良好" "合格"
    
    > list_in_list[[2]]
    $数学成绩
    [1] 99 88 77
    
    $语文成绩
    [1] 66 55 44
    
    > list_in_list[[1]]$性别
    [1] "男" "女" "男"