gpt4 book ai didi

list - R:通过 cbind 的列表列表而无需展平

转载 作者:行者123 更新时间:2023-12-04 06:04:17 25 4
gpt4 key购买 nike

假设我们想将对作为元素存储在列表中,例如,

> x <- list()
> x[[1]] <- list(1,2)
> x[[2]] <- list(3,4)
> x
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[[2]][[1]]
[1] 3

[[2]][[2]]
[1] 4

如果想要通过连接创建相同的东西,而不显式引用外部列表的索引,则一种自然的方法(请参阅下面的编辑以了解此方法的动机)
> c(list(list(1,2)),list(3,4))
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2


[[2]]
[1] 3

[[3]]
[1] 4

有没有办法避免“扁平化”到 c() 的第二个参数从而使用连接来产生 x ?

编辑:我应该明确我的预期应用程序。

最后,每当我在循环中找到一对时,我都想将对添加到列表中。目前,我为主列表维护一个索引,以便在找到新对时将新对添加到它的末尾,但是使用 c也许更自然。因此,使用显式索引,循环可能如下所示
index <- 1
l <- list()
for (i in 1:10) {
for (j in (i+1):10) {
if ( (i+j)%%2 == 0 ) {
l[[index]] <- list(i,j)
index <- index + 1
}
}
}

尝试使用 c 失败看起来像这样
l <- list()
for (i in 1:10) {
for (j in (i+1):10) {
if ( (i+j)%%2 == 0 )
l <- c(l,list(i,j))
}
}

答案:正如下面汤米所指出的,需要一个额外的 list() ,因此以下工作:
l <- list()
for (i in 1:10) {
for (j in (i+1):10) {
if ( (i+j)%%2 == 0 )
l <- c(l,list(list(i,j)))
}
}

很明显的事情我应该想出来的。 Tommy 还指出,这可能不是一种很好的做事方式。

最佳答案

我想简单的答案是“不,你需要额外的 list() 包装器”。

...但总的来说,使用索引将值添加到预分配列表比使用 c() 更好(更快/更少内存)

x <- NULL
for(i in 1:2) x <- c(x, list(list(i,i+1)))
x

x <- vector('list', 2)
for(i in seq_along(x)) x[[i]] <- list(i,i+1)
x

如果 lapply可以使用,这通常更有效:
lapply(1:2, function(i) list(i, i+1))

关于list - R:通过 cbind 的列表列表而无需展平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8557093/

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