列表是一个能组织值、向量、数据框、矩阵等的容器,可以把各种变量按照顺序组织在一起。
还是以表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] "男" "女" "男"
发表评论