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