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


R purrr transpose 转置列表。


[Superseded]

transpose()变成list-of-lists "inside-out";它将一对列表转换为一对列表,或将一对列表转换为列表对。例如,如果您有一个长度为 n 的列表,其中每个组件都有值 ab ,则 transpose() 将创建一个包含元素 ab 的列表,其中包含长度为 n 的列表。之所以称为转置,是因为 x[[1]][[2]] 相当于 transpose(x)[[2]][[1]]

该函数在 purrr 1.0.0 中被取代,因为 list_transpose() 具有更好的名称,并且可以根据通常需要自动简化输出。被取代的函数不会消失,但只会收到关键的错误修复。

用法

transpose(.l, .names = NULL)

参数

.l

要转置的向量列表。第一个元素用作模板;如果后续元素具有不同的长度,您将收到警告。

.names

为了提高效率,transpose() 默认将返回结构基于 .l 的第一个组件。指定 .names 来覆盖它。

.l 相比索引转置的列表。

transpose() 是它自己的逆运算,很像矩阵上的转置运算。您可以通过转置两次来恢复原始输入。

例子

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"
#> 

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Transpose a list.。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。