gpt4 book ai didi

r - Expand.grid 和 mapply 的组合?

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

我正在尝试提出一个 maply 的变体(现在称之为 xapply),它结合了 expand.grid 的功能(某种程度上) 映射。也就是说,对于函数 FUN 和参数列表 L1L2L3... 未知长度,它应该生成一个长度为n1*n2*n3的列表(其中ni是列表i的长度code>),这是将 FUN 应用于列表元素的所有组合的结果。

如果expand.grid能够生成列表列表而不是数据框,那么人们可能能够使用它,但我知道列表可能是无法使用的列表必须很好地适合数据框。

如果正好有三个列表需要扩展,这个函数就可以正常工作,但我很好奇一个更通用的解决方案。 (FLATTEN 未使用,但我可以想象 FLATTEN=FALSE 会生成嵌套列表而不是单个列表...)

xapply3 <- function(FUN,L1,L2,L3,FLATTEN=TRUE,MoreArgs=NULL) {
retlist <- list()
count <- 1
for (i in seq_along(L1)) {
for (j in seq_along(L2)) {
for (k in seq_along(L3)) {
retlist[[count]] <- do.call(FUN,c(list(L1[[i]],L2[[j]],L3[[k]]),MoreArgs))
count <- count+1
}
}
}
retlist
}

编辑:忘记返回结果。人们也许可以通过使用 combn 制作索引列表并从那里开始来解决这个问题......

最佳答案

我认为我对自己的问题有一个解决方案,但也许有人可以做得更好(而且我还没有实现 FLATTEN=FALSE ...)

xapply <- function(FUN,...,FLATTEN=TRUE,MoreArgs=NULL) {
L <- list(...)
inds <- do.call(expand.grid,lapply(L,seq_along)) ## Marek's suggestion
retlist <- list()
for (i in 1:nrow(inds)) {
arglist <- mapply(function(x,j) x[[j]],L,as.list(inds[i,]),SIMPLIFY=FALSE)
if (FLATTEN) {
retlist[[i]] <- do.call(FUN,c(arglist,MoreArgs))
}
}
retlist
}

编辑:我尝试了@baptiste的建议,但这并不容易(或者不适合我)。我得到的最接近的是

xapply2 <- function(FUN,...,FLATTEN=TRUE,MoreArgs=NULL) {
L <- list(...)
xx <- do.call(expand.grid,L)
f <- function(...) {
do.call(FUN,lapply(list(...),"[[",1))
}
mlply(xx,f)
}

这仍然不起作用。 expand.grid 确实比我想象的更灵活(尽管它创建了一个无法打印的奇怪数据框),但是 mlply 内部发生了足够多的魔法,我可以还没有完全让它发挥作用。

这是一个测试用例:

L1 <- list(data.frame(x=1:10,y=1:10),
data.frame(x=runif(10),y=runif(10)),
data.frame(x=rnorm(10),y=rnorm(10)))

L2 <- list(y~1,y~x,y~poly(x,2))
z <- xapply(lm,L2,L1)
xapply(lm,L2,L1)

关于r - Expand.grid 和 mapply 的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515134/

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