当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。