Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中折叠列表_R - Fatal编程技术网

在R中折叠列表

在R中折叠列表,r,R,假设我有一张单子 lst <- list(c("A1", "A1", "A1", "A1", "A1", "A1"), c("", "R1", "R2", "R2", "R2", "R2"), c("", "", "", "U1", "U2", "U3")) 现在,我想要一个单独的向量,元素组合如下 out <- paste0(lst[[1]], lst[[2]], lst[[3]]) 如何更动态地执行此操作(例如,对于较长/较

假设我有一张单子

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

现在,我想要一个单独的向量,元素组合如下

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

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

你只需

do.call("paste0", lst)
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"
这会将
lst
的所有列作为参数传递给
paste0
,因此基本上与

paste0(list[[1]], list[[2]], list[[3]])
但无论在
lst中有多少个向量,它都会起作用

在base R中,
do.call()
与Pythonhas使用的“splat”类型运算符非常接近。
rlang
包引入了另一种使用bang-bang操作符的替代方法。但是您必须构建表达式并显式计算它

library(rlang)
eval_tidy(expr(paste0(!!!lst)))
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"
作为补充,tidyverse风格的答案使用了
purr::pmap

pmap_chr(lst, paste0)
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"
这将使用显式返回字符向量的
pmap
(并行映射)变量。普通版本,
pmap(lst,paste0)
返回与
lst
长度相同的列表,每个元素作为调用
paste0
的输出

[[1]]
[1] "A1"

[[2]]
[1] "A1R1"

[[3]]
[1] "A1R2"

[[4]]
[1] "A1R2U1"

[[5]]
[1] "A1R2U2"

[[6]]
[1] "A1R2U3"

Phantastic,需要查看
do.call
。无可否认,它来自于Python。将尽快接受答案,谢谢。@Jan一些额外的上下文,可能有帮助:
do.call(“rbind”,列出数据帧)
可能是最常见的
do.call
习惯用法。dplyr和data.table都有专门的(fast)函数用于特定目的。如果您想超越基本R,有些人会使用
purrr::pmap
来完成此任务或相关任务,在这些任务中,您要在多个输入上映射函数。@joran:谢谢@joran。首先,我想了解base
R
,最终在未来爬上阶梯。
R
的语法有时很奇怪(至少对我来说是这样)。如果您愿意,可以使用
purr
发布答案,我很乐意为您投票。@Jan还可以查看
do.call
的好友
Reduce(paste0,lst)
。我相信Python中存在一个接近idenditacl名称/行为的函数,尽管已经有一段时间了。
pmap_chr(lst, paste0)
# [1] "A1"     "A1R1"   "A1R2"   "A1R2U1" "A1R2U2" "A1R2U3"
[[1]]
[1] "A1"

[[2]]
[1] "A1R1"

[[3]]
[1] "A1R2"

[[4]]
[1] "A1R2U1"

[[5]]
[1] "A1R2U2"

[[6]]
[1] "A1R2U3"