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