函数 map_if()
和 map_at()
将 .x
作为输入,将函数 .f
应用于 .x
的某些元素,并返回与输入长度相同的列表。
-
map_if()
将谓词函数.p
作为输入,以确定使用.f
转换.x
的哪些元素。 -
map_at()
采用名称或位置向量.at
来指定使用.f
转换.x
的哪些元素。
参数
- .x
-
列表或原子向量。
- .p
-
单个谓词函数、说明此类谓词函数的公式或与
.x
长度相同的逻辑向量。或者,如果.x
的元素本身是对象列表,则为指示内部列表中逻辑元素名称的字符串。只有.p
计算结果为TRUE
的元素才会被修改。 - .f
-
一个函数,通过以下方式之一指定:
-
命名函数,例如
mean
。 -
匿名函数,例如
\(x) x + 1
或function(x) x + 1
。 -
一个公式,例如
~ .x + 1
。您必须使用.x
来引用第一个参数。仅当您需要向后兼容旧版本的 R 时才推荐。 -
字符串、整数或列表,例如
"idx"
、1
或list("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
-
给出要选择的元素的逻辑向量、整数向量或字符向量。或者,函数接受名称向量,并返回要选择的元素的逻辑向量、整数向量或字符向量。
:如果安装了 tidyselect 软件包,则可以使用
vars()
和 tidyselect 帮助器来选择元素。 - .progress
-
是否显示进度条。使用
TRUE
打开基本进度条,使用字符串为其命名,或参阅progress_bars 了解更多详细信息。
例子
# 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 purrr map_depth 在给定深度映射/修改元素
- R purrr map_dfr 返回数据帧的函数
- 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等大神的英文原创作品 Apply a function to each element of a vector conditionally。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。