第七章 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] "男" "女" "男"

评论

发表评论

了解 数据控|突破是我们的每一步 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读