transpose()
變成list-of-lists "inside-out";它將一對列表轉換為一對列表,或將一對列表轉換為列表對。例如,如果您有一個長度為 n 的列表,其中每個組件都有值 a
和 b
,則 transpose()
將創建一個包含元素 a
和 b
的列表,其中包含長度為 n 的列表。之所以稱為轉置,是因為 x[[1]][[2]]
相當於 transpose(x)[[2]][[1]]
。
該函數在 purrr 1.0.0 中被取代,因為 list_transpose()
具有更好的名稱,並且可以根據通常需要自動簡化輸出。被取代的函數不會消失,但隻會收到關鍵的錯誤修複。
參數
- .l
-
要轉置的向量列表。第一個元素用作模板;如果後續元素具有不同的長度,您將收到警告。
- .names
-
為了提高效率,
transpose()
默認將返回結構基於.l
的第一個組件。指定.names
來覆蓋它。
例子
x <- map(1:5, \(i) list(x = runif(1), y = runif(5)))
# was
x |> transpose() |> str()
#> List of 2
#> $ x:List of 5
#> ..$ : num 0.0418
#> ..$ : num 0.67
#> ..$ : num 0.363
#> ..$ : num 0.163
#> ..$ : num 0.505
#> $ y:List of 5
#> ..$ : num [1:5] 0.405 0.864 0.134 0.942 0.627
#> ..$ : num [1:5] 0.509 0.392 0.625 0.731 0.166
#> ..$ : num [1:5] 0.924 0.772 0.161 0.15 0.654
#> ..$ : num [1:5] 0.6985 0.0753 0.7632 0.4615 0.4756
#> ..$ : num [1:5] 0.989 0.546 0.185 0.952 0.732
# now
x |> list_transpose(simplify = FALSE) |> str()
#> List of 2
#> $ x:List of 5
#> ..$ : num 0.0418
#> ..$ : num 0.67
#> ..$ : num 0.363
#> ..$ : num 0.163
#> ..$ : num 0.505
#> $ y:List of 5
#> ..$ : num [1:5] 0.405 0.864 0.134 0.942 0.627
#> ..$ : num [1:5] 0.509 0.392 0.625 0.731 0.166
#> ..$ : num [1:5] 0.924 0.772 0.161 0.15 0.654
#> ..$ : num [1:5] 0.6985 0.0753 0.7632 0.4615 0.4756
#> ..$ : num [1:5] 0.989 0.546 0.185 0.952 0.732
# transpose() is useful in conjunction with safely() & quietly()
x <- list("a", 1, 2)
y <- x |> map(safely(log))
# was
y |> 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
# now:
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
# Previously, output simplification required a call to another function
x <- list(list(a = 1, b = 2), list(a = 3, b = 4), list(a = 5, b = 6))
x |> transpose() |> simplify_all()
#> $a
#> [1] 1 3 5
#>
#> $b
#> [1] 2 4 6
#>
# Now can take advantage of automatic simplification
x |> list_transpose()
#> $a
#> [1] 1 3 5
#>
#> $b
#> [1] 2 4 6
#>
# Provide explicit component names to prevent loss of those that don't
# appear in first component
ll <- list(
list(x = 1, y = "one"),
list(z = "deux", x = 2)
)
ll |> transpose()
#> $x
#> $x[[1]]
#> [1] 1
#>
#> $x[[2]]
#> [1] 2
#>
#>
#> $y
#> $y[[1]]
#> [1] "one"
#>
#> $y[[2]]
#> NULL
#>
#>
nms <- ll |> map(names) |> reduce(union)
# was
ll |> transpose(.names = nms)
#> $x
#> $x[[1]]
#> [1] 1
#>
#> $x[[2]]
#> [1] 2
#>
#>
#> $y
#> $y[[1]]
#> [1] "one"
#>
#> $y[[2]]
#> NULL
#>
#>
#> $z
#> $z[[1]]
#> NULL
#>
#> $z[[2]]
#> [1] "deux"
#>
#>
# now
ll |> list_transpose(template = nms)
#> $x
#> [1] 1 2
#>
#> $y
#> $y[[1]]
#> [1] "one"
#>
#> $y[[2]]
#> NULL
#>
#>
#> $z
#> $z[[1]]
#> NULL
#>
#> $z[[2]]
#> [1] "deux"
#>
#>
# and can supply default value
ll |> list_transpose(template = nms, default = NA)
#> $x
#> [1] 1 2
#>
#> $y
#> [1] "one" NA
#>
#> $z
#> [1] NA "deux"
#>
相關用法
- R purrr accumulate 累積向量縮減的中間結果
- R purrr imap 將函數應用於向量的每個元素及其索引
- R purrr list_transpose 轉置列表
- 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 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 根據元素的名稱/位置保留/丟棄元素
- R purrr keep 根據元素的值保留/丟棄元素
- R purrr flatten 將列表的列表展平為簡單的向量
- R purrr every 列表中的每個元素、部分元素還是沒有一個元素滿足謂詞?
- R purrr detect 查找第一個匹配的值或位置
注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Transpose a list.。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。