当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R purrr map_if 有条件地将函数应用于向量的每个元素


函数 map_if()map_at().x 作为输入,将函数 .f 应用于 .x 的某些元素,并返回与输入长度相同的列表。

  • map_if() 将谓词函数 .p 作为输入,以确定使用 .f 转换 .x 的哪些元素。

  • map_at() 采用名称或位置向量 .at 来指定使用 .f 转换 .x 的哪些元素。

用法

map_if(.x, .p, .f, ..., .else = NULL)

map_at(.x, .at, .f, ..., .progress = FALSE)

参数

.x

列表或原子向量。

.p

单个谓词函数、说明此类谓词函数的公式或与 .x 长度相同的逻辑向量。或者,如果 .x 的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p 计算结果为TRUE 的元素才会被修改。

.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 。相反,使用简写匿名函数:

# Instead of
x |> map(f, 1, 2, collapse = ",")
# do:
x |> map(\(x) f(x, 1, 2, collapse = ","))

这使得更容易理解哪些参数属于哪个函数,并且往往会产生更好的错误消息。

.else

应用于 .x 元素的函数,其中 .p 返回 FALSE

.at

给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。

[Deprecated]:如果安装了 tidyselect 软件包,则可以使用vars()和 tidyselect 帮助器来选择元素。

.progress

是否显示进度条。使用TRUE 打开基本进度条,使用字符串为其命名,或参阅progress_bars 了解更多详细信息。

也可以看看

其他Map变体: imap()lmap()map2()map_depth()map()modify()pmap()

例子

# Use a predicate function to decide whether to map a function:
iris |> map_if(is.factor, as.character) |> str()
#> List of 5
#>  $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...

# Specify an alternative with the `.else` argument:
iris |> map_if(is.factor, as.character, .else = as.integer) |> str()
#> List of 5
#>  $ Sepal.Length: int [1:150] 5 4 4 4 5 5 4 5 4 4 ...
#>  $ Sepal.Width : int [1:150] 3 3 3 3 3 3 3 3 2 3 ...
#>  $ Petal.Length: int [1:150] 1 1 1 1 1 1 1 1 1 1 ...
#>  $ Petal.Width : int [1:150] 0 0 0 0 0 0 0 0 0 0 ...
#>  $ Species     : chr [1:150] "setosa" "setosa" "setosa" "setosa" ...

# Use numeric vector of positions select elements to change:
iris |> map_at(c(4, 5), is.numeric) |> str()
#> List of 5
#>  $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : logi TRUE
#>  $ Species     : logi FALSE

# Use vector of names to specify which elements to change:
iris |> map_at("Species", toupper) |> str()
#> List of 5
#>  $ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#>  $ Sepal.Width : num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#>  $ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#>  $ Petal.Width : num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#>  $ Species     : chr [1:150] "SETOSA" "SETOSA" "SETOSA" "SETOSA" ...
源代码:R/map-if-at.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Apply a function to each element of a vector conditionally。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。