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


R purrr list_transpose 轉置列表


list_transpose() 變成list-of-lists "inside-out"。例如,它將一對列表轉換為一對列表,或將一對列表轉換為一對列表。例如,如果您有一個長度為 n 的列表,其中每個組件都有值 ab ,則 list_transpose() 將創建一個包含元素 ab 的列表,其中包含長度為 n 的列表。

之所以稱為轉置,是因為 x[["a"]][["b"]] 相當於 list_transpose(x)[["b"]][["a"]] ,即轉置列表會以與轉置矩陣類似的方式翻轉索引的順序。

用法

list_transpose(
  x,
  ...,
  template = NULL,
  simplify = NA,
  ptype = NULL,
  default = NULL
)

參數

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/list-transpose.R

相關用法


注:本文由純淨天空篩選整理自Hadley Wickham等大神的英文原創作品 Transpose a list。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。