R语言列表 #
一、列表概述 #
列表(List)是R语言中可以存储不同类型元素的数据结构。列表可以包含向量、矩阵、数据框、甚至其他列表。
二、创建列表 #
2.1 使用list函数 #
r
my_list <- list(
name = "张三",
age = 25,
scores = c(85, 90, 78),
passed = TRUE
)
print(my_list)
2.2 无名称列表 #
r
my_list <- list("张三", 25, c(85, 90, 78), TRUE)
print(my_list)
2.3 混合类型列表 #
r
my_list <- list(
vector = 1:5,
matrix = matrix(1:6, nrow = 2),
dataframe = data.frame(x = 1:3, y = c("a", "b", "c")),
list = list(a = 1, b = 2)
)
print(my_list)
2.4 空列表 #
r
empty_list <- list()
print(empty_list)
empty_list <- vector("list", 3)
print(empty_list)
三、列表属性 #
3.1 长度 #
r
my_list <- list(a = 1, b = 2, c = 3)
length(my_list)
3.2 名称 #
r
my_list <- list(a = 1, b = 2, c = 3)
names(my_list)
names(my_list) <- c("x", "y", "z")
print(my_list)
3.3 类型 #
r
my_list <- list(a = 1, b = 2)
class(my_list)
typeof(my_list)
is.list(my_list)
四、访问列表元素 #
4.1 使用 [[]] 提取元素 #
r
my_list <- list(a = 1, b = c(2, 3), c = "hello")
my_list[[1]]
my_list[[2]]
my_list[["a"]]
my_list[["b"]]
4.2 使用 $ 提取元素 #
r
my_list <- list(a = 1, b = c(2, 3), c = "hello")
my_list$a
my_list$b
my_list$c
4.3 使用 [] 获取子列表 #
r
my_list <- list(a = 1, b = c(2, 3), c = "hello")
my_list[1]
my_list[c(1, 3)]
my_list["a"]
my_list[c("a", "b")]
4.4 [] vs [[]] 的区别 #
r
my_list <- list(a = c(1, 2, 3))
class(my_list["a"])
class(my_list[["a"]])
my_list["a"][1]
my_list[["a"]][1]
五、修改列表 #
5.1 修改元素 #
r
my_list <- list(a = 1, b = 2, c = 3)
my_list$a <- 100
my_list[["b"]] <- 200
my_list[[3]] <- 300
print(my_list)
5.2 添加元素 #
r
my_list <- list(a = 1, b = 2)
my_list$c <- 3
my_list[["d"]] <- 4
my_list[[5]] <- 5
print(my_list)
5.3 删除元素 #
r
my_list <- list(a = 1, b = 2, c = 3, d = 4)
my_list$a <- NULL
my_list[[2]] <- NULL
print(my_list)
5.4 合并列表 #
r
list1 <- list(a = 1, b = 2)
list2 <- list(c = 3, d = 4)
merged <- c(list1, list2)
print(merged)
六、嵌套列表 #
6.1 创建嵌套列表 #
r
nested_list <- list(
person = list(
name = "张三",
age = 25,
address = list(
city = "北京",
district = "朝阳"
)
),
scores = list(
math = 90,
english = 85
)
)
print(nested_list)
6.2 访问嵌套元素 #
r
nested_list$person$name
nested_list[["person"]][["age"]]
nested_list$person$address$city
nested_list[[1]][[3]][[1]]
6.3 修改嵌套元素 #
r
nested_list$person$age <- 26
nested_list$person$address$city <- "上海"
print(nested_list)
七、列表函数 #
7.1 lapply函数 #
r
my_list <- list(a = 1:5, b = 6:10, c = 11:15)
lapply(my_list, sum)
lapply(my_list, mean)
lapply(my_list, function(x) x * 2)
7.2 sapply函数 #
r
my_list <- list(a = 1:5, b = 6:10, c = 11:15)
sapply(my_list, sum)
sapply(my_list, mean)
sapply(my_list, function(x) x[1])
7.3 vapply函数 #
r
my_list <- list(a = 1:5, b = 6:10, c = 11:15)
vapply(my_list, sum, numeric(1))
vapply(my_list, function(x) c(min = min(x), max = max(x)), numeric(2))
7.4 Map函数 #
r
list1 <- list(1, 2, 3)
list2 <- list(10, 20, 30)
Map(function(x, y) x + y, list1, list2)
Map(`+`, list1, list2)
7.5 do.call函数 #
r
my_list <- list(a = c(1, 2, 3), b = c(4, 5, 6))
do.call(c, my_list)
do.call(cbind, my_list)
do.call(rbind, my_list)
八、列表转换 #
8.1 列表转向量 #
r
my_list <- list(a = 1, b = 2, c = 3)
unlist(my_list)
as.vector(my_list)
8.2 列表转数据框 #
r
my_list <- list(
name = c("张三", "李四"),
age = c(25, 30),
city = c("北京", "上海")
)
as.data.frame(my_list)
do.call(data.frame, my_list)
8.3 数据框转列表 #
r
df <- data.frame(
name = c("张三", "李四"),
age = c(25, 30)
)
as.list(df)
split(df, df$name)
九、列表操作技巧 #
9.1 检查元素是否存在 #
r
my_list <- list(a = 1, b = 2)
"a" %in% names(my_list)
!is.null(my_list$a)
exists("a", where = my_list)
9.2 获取元素名称 #
r
my_list <- list(a = 1, b = 2, c = 3)
names(my_list)
9.3 遍历列表 #
r
my_list <- list(a = 1, b = 2, c = 3)
for (name in names(my_list)) {
cat(name, ":", my_list[[name]], "\n")
}
for (i in seq_along(my_list)) {
cat(i, ":", my_list[[i]], "\n")
}
9.4 过滤列表 #
r
my_list <- list(a = 1, b = 2, c = 3, d = 4)
Filter(function(x) x > 2, my_list)
Filter(is.numeric, my_list)
十、purrr包 #
10.1 安装和加载 #
r
install.packages("purrr")
library(purrr)
10.2 map函数 #
r
library(purrr)
my_list <- list(a = 1:5, b = 6:10, c = 11:15)
map(my_list, sum)
map_dbl(my_list, mean)
map_int(my_list, length)
map_chr(my_list, function(x) paste(x, collapse = ","))
10.3 map2函数 #
r
list1 <- list(1, 2, 3)
list2 <- list(10, 20, 30)
map2(list1, list2, `+`)
map2(list1, list2, function(x, y) x * y)
10.4 其他函数 #
r
my_list <- list(a = 1, b = NULL, c = 3)
compact(my_list)
keep(my_list, function(x) x > 1)
discard(my_list, function(x) x < 2)
十一、实践示例 #
11.1 存储复杂数据 #
r
student <- list(
info = list(
name = "张三",
age = 20,
gender = "男"
),
scores = data.frame(
subject = c("数学", "英语", "语文"),
score = c(90, 85, 88)
),
passed = TRUE
)
print(student$info$name)
print(student$scores)
11.2 批量处理文件 #
r
files <- list.files(pattern = "\\.csv$")
data_list <- lapply(files, read.csv)
combined_data <- do.call(rbind, data_list)
11.3 API响应处理 #
r
response <- list(
status = 200,
headers = list(
"content-type" = "application/json",
"date" = "2024-01-15"
),
body = list(
data = list(
list(id = 1, name = "张三"),
list(id = 2, name = "李四")
),
total = 2
)
)
print(response$body$data[[1]]$name)
十二、总结 #
本章学习了:
- 列表的创建方法
- 列表属性:长度、名称、类型
- 列表元素访问:[[]]、$、[]
- 列表修改操作
- 嵌套列表的使用
- lapply、sapply、vapply函数
- 列表转换方法
- purrr包的使用
列表是R语言中最灵活的数据结构,可以存储各种类型的混合数据!
最后更新:2026-03-27