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