list_transpose()
變成list-of-lists "inside-out"。例如,它將一對列表轉換為一對列表,或將一對列表轉換為一對列表。例如,如果您有一個長度為 n
的列表,其中每個組件都有值 a
和 b
,則 list_transpose()
將創建一個包含元素 a
和 b
的列表,其中包含長度為 n
的列表。
之所以稱為轉置,是因為 x[["a"]][["b"]]
相當於 list_transpose(x)[["b"]][["a"]]
,即轉置列表會以與轉置矩陣類似的方式翻轉索引的順序。
參數
- x
-
要轉置的向量列表。
- ...
-
這些點用於將來的擴展,並且必須為空。
- template
-
說明輸出列表的"template"。可以是字符向量(其中按名稱提取元素),也可以是整數向量(其中按位置提取元素)。默認為
x
第一個元素的名稱,或者如果它們不存在,則為整數索引。 - simplify
-
結果應該是simplified嗎?
-
TRUE
:簡化或失敗。 -
NA
:如果可能的話,簡化。 -
FALSE
:永遠不要嘗試簡化,總是以列表形式保留。
或者,指定輸出元素的簡化的命名列表。
-
- ptype
-
用於控製簡化的可選矢量原型。或者,通過輸出元素指定原型的命名列表。
- default
-
如果值不存在或
NULL
則使用默認值。或者,指定默認輸出元素的命名列表。
例子
# list_transpose() is useful in conjunction with safely()
x <- list("a", 1, 2)
y <- x |> map(safely(log))
y |> str()
#> List of 3
#> $ :List of 2
#> ..$ result: NULL
#> ..$ error :List of 2
#> .. ..$ message: chr "non-numeric argument to mathematical function"
#> .. ..$ call : language .Primitive("log")(x, base)
#> .. ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
#> $ :List of 2
#> ..$ result: num 0
#> ..$ error : NULL
#> $ :List of 2
#> ..$ result: num 0.693
#> ..$ error : NULL
# Put all the errors and results together
y |> list_transpose() |> str()
#> List of 2
#> $ result:List of 3
#> ..$ : NULL
#> ..$ : num 0
#> ..$ : num 0.693
#> $ error :List of 3
#> ..$ :List of 2
#> .. ..$ message: chr "non-numeric argument to mathematical function"
#> .. ..$ call : language .Primitive("log")(x, base)
#> .. ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
#> ..$ : NULL
#> ..$ : NULL
# Supply a default result to further simplify
y |> list_transpose(default = list(result = NA)) |> str()
#> List of 2
#> $ result: num [1:3] NA 0 0.693
#> $ error :List of 3
#> ..$ :List of 2
#> .. ..$ message: chr "non-numeric argument to mathematical function"
#> .. ..$ call : language .Primitive("log")(x, base)
#> .. ..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
#> ..$ : NULL
#> ..$ : NULL
# list_transpose() will try to simplify by default:
x <- list(list(a = 1, b = 2), list(a = 3, b = 4), list(a = 5, b = 6))
x |> list_transpose()
#> $a
#> [1] 1 3 5
#>
#> $b
#> [1] 2 4 6
#>
# this makes list_tranpose() not completely symmetric
x |> list_transpose() |> list_transpose()
#> [[1]]
#> a b
#> 1 2
#>
#> [[2]]
#> a b
#> 3 4
#>
#> [[3]]
#> a b
#> 5 6
#>
# use simplify = FALSE to always return lists:
x |> list_transpose(simplify = FALSE) |> str()
#> List of 2
#> $ a:List of 3
#> ..$ : num 1
#> ..$ : num 3
#> ..$ : num 5
#> $ b:List of 3
#> ..$ : num 2
#> ..$ : num 4
#> ..$ : num 6
x |>
list_transpose(simplify = FALSE) |>
list_transpose(simplify = FALSE) |> str()
#> List of 3
#> $ :List of 2
#> ..$ a: num 1
#> ..$ b: num 2
#> $ :List of 2
#> ..$ a: num 3
#> ..$ b: num 4
#> $ :List of 2
#> ..$ a: num 5
#> ..$ b: num 6
# Provide an explicit template if you know which elements you want to extract
ll <- list(
list(x = 1, y = "one"),
list(z = "deux", x = 2)
)
ll |> list_transpose()
#> $x
#> [1] 1 2
#>
#> $y
#> $y[[1]]
#> [1] "one"
#>
#> $y[[2]]
#> NULL
#>
#>
ll |> list_transpose(template = c("x", "y", "z"))
#> $x
#> [1] 1 2
#>
#> $y
#> $y[[1]]
#> [1] "one"
#>
#> $y[[2]]
#> NULL
#>
#>
#> $z
#> $z[[1]]
#> NULL
#>
#> $z[[2]]
#> [1] "deux"
#>
#>
ll |> list_transpose(template = 1)
#> [[1]]
#> [[1]][[1]]
#> [1] 1
#>
#> [[1]][[2]]
#> [1] "deux"
#>
#>
# And specify a default if you want to simplify
ll |> list_transpose(template = c("x", "y", "z"), default = NA)
#> $x
#> [1] 1 2
#>
#> $y
#> [1] "one" NA
#>
#> $z
#> [1] NA "deux"
#>
相關用法
- R purrr list_simplify 將列表簡化為原子或 S3 向量
- R purrr list_flatten 壓平列表
- R purrr list_c 將列表元素組合成單個數據結構
- R purrr list_assign 修改列表
- R purrr lmap 將函數應用於列表的列表元素
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr as_vector 將列表強製轉換為向量
- R purrr map_if 有條件地將函數應用於向量的每個元素
- R purrr map2 映射兩個輸入
- R purrr array-coercion 強製數組列出
- R purrr auto_browse 包裝一個函數,以便在出錯時自動 browser()
- R purrr pluck 安全地獲取或設置嵌套數據結構深處的元素
- R purrr insistently 將函數轉換為等待,然後在錯誤後重試
- R purrr map_depth 在給定深度映射/修改元素
- R purrr rerun 多次重新運行表達式
- R purrr quietly 包裝一個函數來捕獲副作用
- R purrr pmap 同時映射多個輸入(“並行”)
- R purrr possibly 包裝函數以返回值而不是錯誤
- R purrr head_while 查找全部滿足謂詞的頭/尾。
- R purrr rbernoulli 從伯努利分布生成隨機樣本
- R purrr rate-helpers 創建延遲率設置
- R purrr keep_at 根據元素的名稱/位置保留/丟棄元素
- R purrr keep 根據元素的值保留/丟棄元素
- R purrr transpose 轉置列表。
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Transpose a list。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。