R中的折叠列表

时间:2018-04-02 18:57:02

标签: r

假设我有一个列表

lst <- list(c("A1", "A1", "A1", "A1", "A1", "A1"), 
            c("", "R1", "R2", "R2", "R2", "R2"),
            c("", "", "", "U1", "U2", "U3"))

输出

[[1]]
[1] "A1" "A1" "A1" "A1" "A1" "A1"

[[2]]
[1] ""   "R1" "R2" "R2" "R2" "R2"

[[3]]
[1] ""   ""   ""   "U1" "U2" "U3"

<小时/> 现在,我希望有一个单独的向量,其元素组合如此

out <- paste0(lst[[1]], lst[[2]], lst[[3]])

输出将是

[1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"

如何更动态地执行此操作(例如,对于更长/更短的列表)?我试图使用sapply等,但无济于事。

2 个答案:

答案 0 :(得分:4)

只需

即可完成此操作
do.call("paste0", lst)
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"

这会将lst的所有列作为参数传递给paste0,所以它基本上就像在做

paste0(list[[1]], list[[2]], list[[3]])

但无论您在lst

中有多少向量,它都会有效

在基数R中,do.call()与我们得到Python的“splat”类型运算符一样接近。 rlang包引入了bang-bang-bang运算符的另一种选择。但是你必须构建表达式并明确地对其进行评估。

library(rlang)
eval_tidy(expr(paste0(!!!lst)))
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"

答案 1 :(得分:1)

为了补充MrFlick's answer,tidyverse风格的答案使用purrr::pmap

pmap_chr(lst, paste0)
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"

这使用显式返回字符向量的pmap(并行映射)变体。 vanilla版本pmap(lst, paste0)返回与lst长度相同的列表,每个元素作为paste0调用的输出。

[[1]]
[1] "A1"

[[2]]
[1] "A1R1"

[[3]]
[1] "A1R2"

[[4]]
[1] "A1R2U1"

[[5]]
[1] "A1R2U2"

[[6]]
[1] "A1R2U3"