将两组索引传入lapply,在一系列列表中对元素进行索引
我已经找到了很多用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]])
但没有成功。非常感谢任何帮助。
解决方案
在最后一种情况下,使用 Map、mapply 甚至 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。