當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。