这些 map()
、 map2()
、 imap()
和 pmap()
变体通过 row-binding 或 column-binding 输出一起返回数据帧。
这些函数在 purrr 1.0.0 中被取代,因为它们的名称表明它们的工作方式类似于 _lgl()
、 _int()
等,需要长度为 1 的输出,但实际上它们返回任意大小的结果,因为结果在组合时没有任何大小检查。此外,他们使用dplyr::bind_rows()
和dplyr::bind_cols()
,这需要安装dplyr并且与边情况具有令人困惑的语义。被取代的函数不会消失,但只会收到关键的错误修复。
相反,我们建议将 map()
、 map2()
等与 list_rbind()
和 list_cbind()
一起使用。它们在底层使用vctrs::vec_rbind()
和vctrs::vec_cbind()
,并且具有更清楚地反映其语义的名称。
用法
map_dfr(.x, .f, ..., .id = NULL)
map_dfc(.x, .f, ...)
imap_dfr(.x, .f, ..., .id = NULL)
imap_dfc(.x, .f, ...)
map2_dfr(.x, .y, .f, ..., .id = NULL)
map2_dfc(.x, .y, .f, ...)
pmap_dfr(.l, .f, ..., .id = NULL)
pmap_dfc(.l, .f, ...)
参数
- .id
-
字符串或
NULL
。如果是字符串,则输出将包含具有该名称的变量,存储输入的名称(如果.x
已命名)或索引(如果.x
未命名)。如果是NULL
,默认情况下,不会创建任何变量。仅适用于
_dfr
变体。
例子
# map ---------------------------------------------
# Was:
mtcars |>
split(mtcars$cyl) |>
map(\(df) lm(mpg ~ wt, data = df)) |>
map_dfr(\(mod) as.data.frame(t(as.matrix(coef(mod)))))
#> (Intercept) wt
#> 1 39.57120 -5.647025
#> 2 28.40884 -2.780106
#> 3 23.86803 -2.192438
# Now:
mtcars |>
split(mtcars$cyl) |>
map(\(df) lm(mpg ~ wt, data = df)) |>
map(\(mod) as.data.frame(t(as.matrix(coef(mod))))) |>
list_rbind()
#> (Intercept) wt
#> 1 39.57120 -5.647025
#> 2 28.40884 -2.780106
#> 3 23.86803 -2.192438
# map2 ---------------------------------------------
ex_fun <- function(arg1, arg2){
col <- arg1 + arg2
x <- as.data.frame(col)
}
arg1 <- 1:4
arg2 <- 10:13
# was
map2_dfr(arg1, arg2, ex_fun)
#> col
#> 1 11
#> 2 13
#> 3 15
#> 4 17
# now
map2(arg1, arg2, ex_fun) |> list_rbind()
#> col
#> 1 11
#> 2 13
#> 3 15
#> 4 17
# was
map2_dfc(arg1, arg2, ex_fun)
#> New names:
#> • `col` -> `col...1`
#> • `col` -> `col...2`
#> • `col` -> `col...3`
#> • `col` -> `col...4`
#> col...1 col...2 col...3 col...4
#> 1 11 13 15 17
# now
map2(arg1, arg2, ex_fun) |> list_cbind()
#> New names:
#> • `col` -> `col...1`
#> • `col` -> `col...2`
#> • `col` -> `col...3`
#> • `col` -> `col...4`
#> col...1 col...2 col...3 col...4
#> 1 11 13 15 17
相关用法
- R purrr map_depth 在给定深度映射/修改元素
- R purrr map_if 有条件地将函数应用于向量的每个元素
- R purrr map2 映射两个输入
- R purrr map 将函数应用于向量的每个元素
- R purrr modify_in 修改拔取位置
- R purrr modify_tree 递归修改列表
- R purrr modify 有选择地修改元素
- R purrr accumulate 累积向量缩减的中间结果
- R purrr imap 将函数应用于向量的每个元素及其索引
- R purrr list_transpose 转置列表
- R purrr as_vector 将列表强制转换为向量
- R purrr array-coercion 强制数组列出
- R purrr auto_browse 包装一个函数,以便在出错时自动 browser()
- R purrr pluck 安全地获取或设置嵌套数据结构深处的元素
- R purrr insistently 将函数转换为等待,然后在错误后重试
- R purrr list_simplify 将列表简化为原子或 S3 向量
- R purrr rerun 多次重新运行表达式
- R purrr quietly 包装一个函数来捕获副作用
- R purrr list_flatten 压平列表
- R purrr pmap 同时映射多个输入(“并行”)
- R purrr possibly 包装函数以返回值而不是错误
- R purrr head_while 查找全部满足谓词的头/尾。
- R purrr rbernoulli 从伯努利分布生成随机样本
- R purrr rate-helpers 创建延迟率设置
- R purrr keep_at 根据元素的名称/位置保留/丢弃元素
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Functions that return data frames。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。