在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。首先,我想了解baseR
,最终在未来爬上阶梯。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"