将函数应用于向量的每个元素

Author

Han Wang

Published

November 12, 2023

简介

map函数通过对列表或原子向量的每个元素应用一个函数,并返回与输入长度相同的对象,来转换它们的输入。

  • map() 总是返回一个列表。如果需要返回与输入类型相同的对象,可以参考 modify() 系列函数。
  • map_lgl(), map_int(), map_dbl()map_chr() 返回指定类型的原子向量(如果无法完成则会出错)。对于这些函数,.f 必须返回适当类型的长度为1的向量。
  • map_vec() 简化为输出的共同类型。它适用于大多数类型的简单向量,如Date、POSIXct、因子等。
  • walk() 为了其副作用而调用 .f,并返回输入的 .x

用法

map(.x, .f, ..., .progress = FALSE)

map_lgl(.x, .f, ..., .progress = FALSE)

map_int(.x, .f, ..., .progress = FALSE)

map_dbl(.x, .f, ..., .progress = FALSE)

map_chr(.x, .f, ..., .progress = FALSE)

map_vec(.x, .f, ..., .ptype = NULL, .progress = FALSE)

walk(.x, .f, ..., .progress = FALSE)

参数

.x

一个列表或原子向量。

.f

以以下几种方式之一指定的函数:

  • 命名函数,例如 mean
  • 匿名函数,例如 \(x) x + 1function(x) x + 1
  • 公式,例如 ~ .x + 1。必须使用 .x 来引用第一个参数。仅在需要与R的旧版本兼容时推荐使用。
  • 字符串、整数或列表,例如 "idx"1list("idx", 1),它们分别是 \(x) pluck(x, "idx")\(x) pluck(x, 1)\(x) pluck(x, "idx", 1) 的简写。如果索引元素为 NULL 或不存在,可以选择性地提供 .default 以设置默认值。

...

传递给映射函数的额外参数。

我们现在通常不建议使用 ... 来传递 .f 的额外(常量)参数。相反,使用简写匿名函数:

# 代替
x |> map(f, 1, 2, collapse = ",")
# 使用:
x |> map(\(x) f(x, 1, 2, collapse = ","))

.progress

是否显示进度条。使用 TRUE 打开基本进度条,使用字符串来命名,或查看 progress_bars 获取更多详情。

.ptype

如果为 NULL(默认值),输出类型是结果元素的共同类型。否则,提供一个”原型”以指定期望的输出类型。

返回值

输出的长度由输入的长度决定。输出的名称由输入的名称决定。输出类型由后缀决定:

  • 无后缀:一个列表;.f() 可以返回任何内容。
  • _lgl()_int()_dbl()_chr() 分别返回逻辑向量、整数向量、双精度向量或字符向量;.f() 必须返回长度为1的兼容原子向量。
  • _vec() 返回原子或S3向量,即 .f 返回的类型。.f 可以返回几乎任何类型的向量,只要其长度为1。
  • walk() 返回输入的 .x(不可见)。这使得在管道中使用它变得容易。.f() 的返回值被忽略。

.f 抛出的任何错误都会被封装在一个带有类 purrr_error_indexed 的错误中。

另请参阅

map_if() 用于仅对满足指定条件的 .x 的元素应用函数。

其他映射变体:imap(), lmap(), map2(), map_depth(), map_if(), modify(), pmap()

一些示例用法

  1. 使用 map() 应用函数: 假设你有一个数字列表,你想计算每个数字的平方。使用 purrrmap() 函数可以轻松实现:

    library(purrr)
    Warning: package 'purrr' was built under R version 4.3.2
    numbers <- list(1, 2, 3, 4)
    squares <- map(numbers, ~ .x ^ 2)
    squares
    [[1]]
    [1] 1
    
    [[2]]
    [1] 4
    
    [[3]]
    [1] 9
    
    [[4]]
    [1] 16

    这段代码将对列表中的每个元素应用平方函数,并返回新的列表。

  2. 使用 map_dbl() 保持输出类型一致: 如果你希望输出的结果是一个双精度向量,可以使用 map_dbl()

    squares_dbl <- map_dbl(numbers, ~ .x ^ 2)
    squares_dbl
    [1]  1  4  9 16

    这样可以确保输出结果是双精度向量,而不是列表。

  3. 使用 reduce() 合并数据: 假设你有多个向量,你想将它们合并为一个向量。使用 reduce() 函数可以轻松完成:

    vectors <- list(c(1, 2), c(3, 4), c(5, 6))
    combined <- reduce(vectors, c)
    combined
    [1] 1 2 3 4 5 6

    这段代码将所有向量合并为一个。

  4. 使用 map_if() 进行条件映射: 如果你只想对列表中满足特定条件的元素应用函数,可以使用 map_if()

    mixed_list <- list(1, "a", 3, "b")
    only_numbers_squared <- map_if(mixed_list, is.numeric, ~ .x ^ 2)
    only_numbers_squared
    [[1]]
    [1] 1
    
    [[2]]
    [1] "a"
    
    [[3]]
    [1] 9
    
    [[4]]
    [1] "b"

    这段代码仅对列表中的数字元素应用平方函数。

通过这些示例可以看出,purrr 提供了一种灵活、直观的方式来处理列表和向量,特别是在需要对数据集的每个元素应用函数或条件逻辑时。这使得数据分析和处理更加高效和简洁。

工作环境

devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.3.1 (2023-06-16 ucrt)
 os       Windows 11 x64 (build 22621)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Chinese (Simplified)_China.utf8
 ctype    Chinese (Simplified)_China.utf8
 tz       Asia/Hong_Kong
 date     2023-11-12
 pandoc   3.1.9 @ C:/Users/HANWAN~1/AppData/Local/Pandoc/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package     * version date (UTC) lib source
 cachem        1.0.8   2023-05-01 [1] CRAN (R 4.3.1)
 callr         3.7.3   2022-11-02 [1] CRAN (R 4.3.1)
 cli           3.6.1   2023-03-23 [1] CRAN (R 4.3.1)
 crayon        1.5.2   2022-09-29 [1] CRAN (R 4.3.1)
 devtools      2.4.5   2022-10-11 [1] CRAN (R 4.3.2)
 digest        0.6.33  2023-07-07 [1] CRAN (R 4.3.1)
 ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.3.1)
 evaluate      0.21    2023-05-05 [1] CRAN (R 4.3.1)
 fastmap       1.1.1   2023-02-24 [1] CRAN (R 4.3.1)
 fs            1.6.3   2023-07-20 [1] CRAN (R 4.3.1)
 glue          1.6.2   2022-02-24 [1] CRAN (R 4.3.1)
 htmltools     0.5.5   2023-03-23 [1] CRAN (R 4.3.1)
 htmlwidgets   1.6.2   2023-03-17 [1] CRAN (R 4.3.1)
 httpuv        1.6.11  2023-05-11 [1] CRAN (R 4.3.1)
 jsonlite      1.8.7   2023-06-29 [1] CRAN (R 4.3.1)
 knitr         1.43    2023-05-25 [1] CRAN (R 4.3.1)
 later         1.3.1   2023-05-02 [1] CRAN (R 4.3.1)
 lifecycle     1.0.3   2022-10-07 [1] CRAN (R 4.3.1)
 magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.3.1)
 memoise       2.0.1   2021-11-26 [1] CRAN (R 4.3.1)
 mime          0.12    2021-09-28 [1] CRAN (R 4.3.0)
 miniUI        0.1.1.1 2018-05-18 [1] CRAN (R 4.3.1)
 pkgbuild      1.4.2   2023-06-26 [1] CRAN (R 4.3.1)
 pkgload       1.3.2.1 2023-07-08 [1] CRAN (R 4.3.1)
 prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.3.1)
 processx      3.8.2   2023-06-30 [1] CRAN (R 4.3.1)
 profvis       0.3.8   2023-05-02 [1] CRAN (R 4.3.1)
 promises      1.2.0.1 2021-02-11 [1] CRAN (R 4.3.1)
 ps            1.7.5   2023-04-18 [1] CRAN (R 4.3.1)
 purrr       * 1.0.2   2023-08-10 [1] CRAN (R 4.3.2)
 R6            2.5.1   2021-08-19 [1] CRAN (R 4.3.1)
 Rcpp          1.0.11  2023-07-06 [1] CRAN (R 4.3.1)
 remotes       2.4.2.1 2023-07-18 [1] CRAN (R 4.3.1)
 rlang         1.1.1   2023-04-28 [1] CRAN (R 4.3.1)
 rmarkdown     2.23    2023-07-01 [1] CRAN (R 4.3.1)
 rstudioapi    0.15.0  2023-07-07 [1] CRAN (R 4.3.1)
 sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.3.1)
 shiny         1.7.4.1 2023-07-06 [1] CRAN (R 4.3.1)
 stringi       1.7.12  2023-01-11 [1] CRAN (R 4.3.0)
 stringr       1.5.0   2022-12-02 [1] CRAN (R 4.3.1)
 urlchecker    1.0.1   2021-11-30 [1] CRAN (R 4.3.1)
 usethis       2.2.2   2023-07-06 [1] CRAN (R 4.3.1)
 vctrs         0.6.3   2023-06-14 [1] CRAN (R 4.3.1)
 xfun          0.39    2023-04-20 [1] CRAN (R 4.3.1)
 xtable        1.8-4   2019-04-21 [1] CRAN (R 4.3.1)
 yaml          2.3.7   2023-01-23 [1] CRAN (R 4.3.0)

 [1] C:/Users/Han Wang/AppData/Local/R/win-library/4.3
 [2] C:/Program Files/R/R-4.3.1/library

──────────────────────────────────────────────────────────────────────────────