将两组索引传入lapply,在一系列列表中对元素进行索引

编程语言 2026-07-09

我已经找到了很多用lapply把两个参数传给一个带有两个参数的函数的例子,但还没有看到如何把两组索引传给一个函数。

说得容易,做起来难。创建一个总括函数,用来运行两种不同类型的回归

omnibusFunct <- function(d, outcomeName) {

  # reg regression
  lm(formula = reformulate(termlabels = "Species",
                            response = outcomeName),
     data = d) -> fit_reg

  # poisson regression
  glm(formula = reformulate(termlabels = "Species",
                        response = outcomeName),
      data = d,
      family = poisson) -> pois_reg

  return(list("outcome name" = outcomeName,
              "regular regression" = fit_reg,
              "poisson regression" = pois_reg))
}

现在该函数有三个元素,可以通过 [[foo]] 索引访问

# for the standard regression
omnibusFunct(d = iris,
             outcomeName = "Sepal.Length")[[2]]

# output
# Call:
#   lm(formula = reformulate(termlabels = "Species", response = outcomeName), 
#      data = d)
# 
# Coefficients:
#   (Intercept)  Speciesversicolor   Speciesvirginica  
# 5.006              0.930              1.582

现在假设我们想对这三个结果中的每一个运行这个总括函数

lapply(X = c("Sepal.Length",
             "Sepal.Width",
             "Petal.Length"),
       FUN = function(i) omnibusFunct(d = iris, 
                                      outcomeName = i)) -> regressionList

现在进入关键部分。假设我只想通过 [[foo1]][[foo2]] 对其中一个回归进行索引,其中 foo1 是对整体总括函数的索引,foo2 是该总括函数中的一个元素。我可以在通过lapply对这三个总括函数中的每一个返回同一个元素

lapply(X = 1:3,
       FUN = function(i) regressionList[[i]][[2]])

这将为三个结果中的每一个返回线性回归。但如果我想对第一和第三个结果返回线性回归(Sepal.Length和 Petal.Length),而对第二个结果返回泊松回归。这将需要两组索引:一组用于结果(1:3),一组用于从每组结果中提取的元素,在本例中依次是2、3、2。

我尝试了

lapply(X = 1:3,
       j = c(2,3,2)
       FUN = function(i) regressionList[[i]][[j]])

但没有成功。非常感谢任何帮助。

解决方案

在最后一种情况下,使用 Mapmapply 甚至 lapply

Map(\(i, j) regressionList[[i]][[j]], i = 1:3, j = c(2, 3, 2))

Map(\(i, j) regressionList[[c(i, j)]], i = 1:3, j = c(2,3,2))

Map(\(x) regressionaList[[x]], list(c(1,2), c(2,3), c(3,2)) )

lapply(list(c(1,2), c(2,3), c(3,2)), \(x) regressionaList[[x]] )

注意,在purrr中的 list_transpose 可以把一个包含两个长度为n 的向量的列表转换为一个长度为n 的成对元素列表,反之亦然。

library(purrr)
L <- list(i = 1:3, j = c(2, 3, 2))
Pairs <- L |> list_transpose(); Pairs
## [[1]]
## i j 
## 1 2 
##
## [[2]]
## i j 
## 2 3 
##
## [[3]]
## i j 
## 3 2 

L_restored <- list_transpose(Pairs); L_restored
## $i
## [1] 1 2 3
##
## $j
## [1] 2 3 2
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章