gpt4 book ai didi

r - 使用 Map at depth 来绑定(bind) r 中的列

转载 作者:行者123 更新时间:2023-12-01 13:51:52 25 4
gpt4 key购买 nike

我正在尝试将列cbind 到列表中的列表,但没有成功。如果列表的深度为 1,则示例如下所示,我想在每个列表对象的示例数据框中添加日期:

ex_df_plain <- list(cbind(1,2), 
cbind(3,4))
Map(cbind, as.list(c(2016, 2017)), ex_df_plain)

[[1]]
[,1] [,2] [,3]
[1,] 2016 1 2

[[2]]
[,1] [,2] [,3]
[1,] 2017 3 4

但是当我尝试将其应用于列表深度大于 1 的列表对象时,cbind 会减少列表元素而不是合并:

at_depth_df <- list(as.list(c(1,2)), as.list(c(3,4)))

Map(cbind,
list(as.list(c(2015, 2016)), as.list(c(2017, 2018))),
at_depth_df)

[[1]]
[,1] [,2]
[1,] 2015 1
[2,] 2016 2

[[2]]
[,1] [,2]
[1,] 2017 3
[2,] 2018 4

我的预期输出应该是

[[1]]
[[1]][[1]]
[,1] [,2]
[1,] 2015 1

[[1]][[2]]
[,1] [,2]
[1,] 2016 2


[[2]]
[[2]][[1]]
[,1] [,2]
[1,] 2017 3

[[2]][[2]]
[,1] [,2]
[1,] 2018 4

最佳答案

我们需要一个递归的Map

Map(function(x, y) Map(cbind, x, y), lst1, at_depth_df)

在哪里

lst1 <- list(as.list(c(2015, 2016)), as.list(c(2017, 2018)))

我们可以写一个函数来做到这一点

f1 <- function(x, y, fun) {
if(is.atomic(x) && is.atomic(y)) {
x1 <- match.fun(fun)(x,y)
dimnames(x1) <- NULL
x1
} else {
Map(f1, x, y, MoreArgs = list(fun = fun))
}
}

f1(lst1, at_depth_df, cbind)
#[[1]]
#[[1]][[1]]
# [,1] [,2]
#[1,] 2015 1

#[[1]][[2]]
# [,1] [,2]
#[1,] 2016 2


#[[2]]
#[[2]][[1]]
# [,1] [,2]
#[1,] 2017 3

#[[2]][[2]]
# [,1] [,2]
#[1,] 2018 4

关于r - 使用 Map at depth 来绑定(bind) r 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44761397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com