gpt4 book ai didi

r - 高效修改R中的列表

转载 作者:行者123 更新时间:2023-12-03 02:02:24 26 4
gpt4 key购买 nike

我有 foreach 循环,它在每个循环内生成一个列表,还有一个 .combine 函数来组合它们,如下所示:

mergelists = function(x,xn) {
padlen = length(x[[1]])
for (n in names(x)[!names(x) %in% names(xn)]) xn[[n]] = 0
for (n in names(xn)[!names(xn) %in% names(x)]) xn[[n]] = c(rep(0,padlen), xn[[n]])
for (idx in names(xn)) { x[[idx]] = c( x[[idx]], xn[[idx]] ) }
x
}

前两个 for 循环修改新列表 (xn),使其与收集结果的列表 (x) 兼容。最后一个将 xxn 连接到 x 上。

我相信我的代码效率低得离谱,因为它重新分配了很多并使用了 for 循环。但我想不出更好的解决办法。有什么想法吗?

更多解释:我事先不知道列表名称(它们是在 foreach 部分中进行的引导练习的模式)。

示例:

> x
$foo
[1] 3 2

$bar
[1] 3 2

> xn
$foo
[1] 1

$baz
[1] 1

应该加入

> x
$foo
[1] 3 2 1

$bar
[1] 3 2 0

$baz
[1] 0 0 1

就是这样。

最佳答案

在我的基准测试中,这种方法比你的方法花费的时间更长,但由于我已经解决了这个问题,所以我想无论如何我都会发布它。这里要加倍努力。如果名称完全未知,并且您被迫在 .combine 函数中用零填充,您可以尝试以下操作。 (也许首先在迭代的子集上尝试一下,看看它是否有效):

library(reshape2)

mergeList2 <- function(x, xn) {
xDF <- data.frame(ID = seq_along(x[[1]]), x)
xnDF <- data.frame(ID = seq_along(xn[[1]]) + nrow(xDF), xn)
meltedX <- melt(xDF, id = "ID")
meltedXN <- melt(xnDF, id = "ID")
res <- as.list(dcast(rbind(meltedX, meltedXN), ID ~ variable,
fill = 0))[-1]
return(res)
}

你的例子:

mergeList2(list(foo = c(3, 2), bar = c(3, 2)),
list(foo = 1, baz= 1))

# $foo
# [1] 3 2 1

# $bar
# [1] 3 2 0

# $baz
# [1] 0 0 1

使用 foreach 示例进行测试

set.seed(1)

foreach(dd = 1:10, .combine = mergeList2) %do% {
theNames <- sample(c("foo", "bar", "baz"), 2)
ans <- as.list(rpois(2, 4))
names(ans) <- theNames
ans
}

# $foo
# [1] 4 7 2 4 0 2 0 4 5 3

# $baz
# [1] 7 0 0 5 3 5 3 4 0 5

# $bar
# [1] 0 5 2 0 5 0 0 0 6 0

关于r - 高效修改R中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227644/

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